我正在尝试编写电池监控应用程序,其功能之一是跟踪充电时间和与之相关的日期。
首先,我使用SharedPreferences在主活动类中编写了所有内容,并且它确实有效。但是,我希望即使在后台也能跟踪充值次数,所以我用谷歌搜索并认为WakefulBroadcastReceiver + IntentService可能是最有效/最简单的方法。
我错了。我坚持到这里,我认为我现在遇到的问题是显示器(IntentService部分)甚至没有启动!我想我可能在清单上写错了但我却找不到它。
这里是我的代码:
的AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mobiledevices.batteryapp" >
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name=".RechargeMonitor"
android:exported="false" />
</application>
BootReceiver.java
package com.mobiledevices.batteryapp;
import android.content.Intent;
import android.content.Context;
import android.support.v4.content.WakefulBroadcastReceiver;
public class BootReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
Intent startServiceIntent = new Intent(context, RechargeMonitor.class);
startWakefulService(context, startServiceIntent);
}
}
RechargeMonitor.java
package com.mobiledevices.batteryapp;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;
import android.content.SharedPreferences;
import android.os.BatteryManager;
import android.widget.Toast;
public class RechargeMonitor extends IntentService {
public RechargeMonitor(){
super("RechargeMonitor");
}
@Override
protected void onHandleIntent(Intent intent){
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
this.registerReceiver(this.batteryinfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
private BroadcastReceiver batteryinfoReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getExtras().getBoolean(BatteryManager.EXTRA_PRESENT) &&
intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0)!=0 &&
intent.getIntExtra(BatteryManager.EXTRA_STATUS, 0)==BatteryManager.BATTERY_STATUS_CHARGING){
SharedPreferences settings = getSharedPreferences(MainActivity.PREF_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
int count = settings.getInt("COUNT", 0);
editor.putInt("COUNT", count+1);
editor.commit();
}
}
};
}
MainActivity.java太长了,所以我不在这里发布。但是,它不应该有任何问题,除非我必须在活动文件中调用BootReceiver / RechargeMonitor,我想我不需要,因为manifest + BootReciver应该处理自动启动,它甚至不成问题。
我现在遇到的问题再一次是RechargeMonitor似乎没有开始(我没有看到任何Toast消息。)
我要确定的另一件事是,只要我的名字正确,SharedPreferences应该可以在同一个应用程序中随处访问。我已经在好几个地方看到过,但我需要一个坚实的答案。
谢谢!