即使在应用程序关闭时也能获取电池状态



嘿,我正在尝试制作一个应用程序,当手机连接到电源时,告诉我电池何时充满。我做了一个服务,用一个广播接收器来检查电池状态。每当我接通或断开手机电源时,我的应用程序就会崩溃。服务仍然运行,当电池电量满时我得到通知。

我不知道为什么应用程序一次又一次地崩溃。这是我的代码

公共类Srvc扩展服务{

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    // TODO Auto-generated method stub
     final IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     this.registerReceiver(this.br, ifilter);

    System.out.println("started the service");

    return super.onStartCommand(intent,flags,startId);
}

public final BroadcastReceiver br = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("inside on recieve");
        chckbttry(intent);
    }
};
private void chckbttry(Intent intent) {
    // TODO Auto-generated method stub
    System.out.println("inside chckbttry method");
    final int currLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
    final int maxLevel = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
    int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
    boolean isCharged = status == BatteryManager.BATTERY_STATUS_FULL;
    final int percentage = (int) Math.round((currLevel * 100.0) / maxLevel);
    if (status == BatteryManager.BATTERY_STATUS_CHARGING)
    {
         System.out.println("calling the BrdCst_strt");

     if (percentage == 100 || isCharged==true) {
         System.out.println("bttry fully chrged");
         Intent i = new Intent(getBaseContext(),PlayMus.class); //call another activity
         i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         i.putExtra("msg", "Battery fully charged");
         getApplication().startActivity(i);
     }
    else
     {
        System.out.println("not yet charged");
        Intent i = new Intent(getBaseContext(), Test.class);
         i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
         i.putExtra("msg", "Battery not fully charged");
         getApplication().startActivity(i);

    } 
    }
    if (status == BatteryManager.BATTERY_STATUS_DISCHARGING)
    {
        System.out.println("unregistering the service");
        unregisterReceiver(br);
    }
} 
@Override
public void onDestroy() {
    // TODO Auto-generated method stub
    System.out.println("service stopped");
    unregisterReceiver(br);
    super.onDestroy();
}

}

请帮帮我。

谢谢。

电池电量等系统消息作为广播通过整个系统发送。您可以使用所谓的BroadcastReceiver接收它们。

虽然活动有一个UI,你需要使用服务这意味着在后台使用更长时间的工作,而你的应用程序是不可见的。你的应用程序必须至少启动一次才能启动这个服务

MainActivity.java

public class MainActivity extends ActionBarActivity {
    private MyService service;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (service == null) {
            // start service
            Intent i = new Intent(this, MyService.class);
            startService(i);
        }
        // finish our activity. It will be started when our battery is full.
        finish();
    }
}

MyService.java

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("MyService", "onStartCommand");
        // do not receive all available system information (it is a filter!)
        final IntentFilter battChangeFilter = new IntentFilter(
                Intent.ACTION_BATTERY_CHANGED);
        // register our receiver
        this.registerReceiver(this.batteryChangeReceiver, battChangeFilter);
        return super.onStartCommand(intent, flags, startId);
    }
    private final BroadcastReceiver batteryChangeReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, final Intent intent) {
            checkBatteryLevel(intent);
        }
    };
    @Override
    public IBinder onBind(Intent intent) {
        // There are Bound an Unbound Services - you should read about the differences. This one is an unbound one.
        return null;
    }
    private void checkBatteryLevel(Intent batteryChangeIntent) {
        // some calculations
        final int currLevel = batteryChangeIntent.getIntExtra(
                BatteryManager.EXTRA_LEVEL, -1);
        final int maxLevel = batteryChangeIntent.getIntExtra(
                BatteryManager.EXTRA_SCALE, -1);
        final int percentage = (int) Math.round((currLevel * 100.0) / maxLevel);
        Log.d("MySerive", "current battery level: " + percentage);
        // full battery
        if (percentage == 100) {
            Log.d("MySerive", "battery fully loaded");
            Intent intent = new Intent(getBaseContext(), SecondActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getApplication().startActivity(intent);
        }
        // do not forget to unregister
        unregisterReceiver(batteryChangeReceiver);
    }
}

Manifest.xml: 你需要一个service的条目——就像一个Activity。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.mybatteryservice"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.mybatteryservice.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.mybatteryservice.SecondActivity" >
        </activity>
        <service android:name="com.example.mybatteryservice.MyService" >
        </service>
    </application>
</manifest>

如果你有任何问题,请告诉我!

致以最亲切的问候文森特

将代码编写为服务。使用

很简单
public class ClassName extends Service{
         //write your code

       }

也添加到manifest

<service android:name="com.test.ClassName">               
           </service>

///////////////////新代码 ///////////////////

public class BatCheck extends Service {
  public void onCreate() {
    super.onCreate();

            BroadcastReceiver br = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
                  boolean isCharged = status == BatteryManager.BATTERY_STATUS_FULL;
                      if(isCharged){
                         // write your code
                          }
        }
    };
}

}

////////////////另一个 ///////////////////

在你的舱单

   <receiver android:name=".BatCheck">
  <intent-filter>
    <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
  </intent-filter>
</receiver>

在你的活动

    public class BatCheck extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) { 
        int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
        boolean isCharged = status == BatteryManager.BATTERY_STATUS_FULL;
              if(isCharged){
                 // write your code
                  }
    }
}

相关内容

  • 没有找到相关文章

最新更新