嘿,我正在尝试制作一个应用程序,当手机连接到电源时,告诉我电池何时充满。我做了一个服务,用一个广播接收器来检查电池状态。每当我接通或断开手机电源时,我的应用程序就会崩溃。服务仍然运行,当电池电量满时我得到通知。
我不知道为什么应用程序一次又一次地崩溃。这是我的代码
公共类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
}
}
}