バックグラウンドで実行され、小さな作業のために毎時間トリガーされるサービスを設計しています。アプリの実行中、サービスは 10 秒ごとにトリガーされ、アプリが終了すると 1 時間間隔に戻ります。
アプリが中断されないようにすることが非常に重要であるため、このトピックに関する Google ドキュメントで推奨されているような WakefulBroadcastReceiver を使用しています。
しかし、私のアプリは多くのバッテリーを消耗しているようです。充電が大幅に遅くなるのに十分です。また、システム、画面などでバッテリーの状態が 60% と表示され、アプリの通知がありません。だから私は、私のアプリが誤って電話を起動したままにしているが、CPU自体を使用していないと考えています。
これが私のアプリによって引き起こされないようにしたい(そして他の人の電話を使い果たしたくない)ので、私がサービスを実装している方法に明らかに問題があるかどうかを尋ねたい.
主な活動
/*import*/
public class MainActivity extends Activity {
public static String versionname;
public static int versioncode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AlarmManager alarmMgr;
PendingIntent alarmIntent;
alarmMgr = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
Intent newintent = new Intent(getApplicationContext(), WakefulTickReceiver.class);
alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, newintent, 0);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() +
1 * 1000, alarmIntent);
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
setContentView(R.layout.activity_main);
}
}
WakefulBroadcastReceiver
/*import*/
public class WakefulTickReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Start the service, keeping the device awake while the service is
// launching. This is the Intent to deliver to the service.
Intent service = new Intent(context, TickIntendService.class);
service.setAction(intent.getAction());
startWakefulService(context, service);
}
}
インテントサービス
/*import*/
public class TickIntendService extends IntentService {
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
public void sheduleIntent(){
AlarmManager alarmMgr;
PendingIntent alarmIntent;
alarmMgr = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
Intent newintent = new Intent(getApplicationContext(), WakefulTickReceiver.class);
alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, newintent, 0);
alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() +
60 * 60 * 1000, alarmIntent);
}
/**
* The IntentService calls this method from the default worker thread with
* the intent that started the service. When this method returns, IntentService
* stops the service, as appropriate.
*/
@Override
protected void onHandleIntent(Intent intent) {
Log.i("IdleHacker","#~# starting service intent on " + intent.toString());
if (intent.getAction() != null && intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
Log.i("IdleHacker","starting boot service intent on " + intent.toString());
sheduleIntent();
return;
}
Bundle extras = intent.getExtras();
// Do the work that requires your app to keep the CPU running.
// Normally we would do some work here, like download a file.
sheduleIntent();
// Release the wake lock provided by the WakefulBroadcastReceiver.
WakefulTickReceiver.completeWakefulIntent(intent);
}
/**
* A constructor is required, and must call the super IntentService(String)
* constructor with a name for the worker thread.
*/
public TickIntendService() {
super("TickService");
}
}
マニフェスト
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" >
<application>
<activity android:name=".view.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name=".service.TickIntendService"></service>
<receiver android:name=".service.WakefulTickReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
</manifest>
不要なものはすべて削除しようとしましたが、何か不足している場合はコメントを書いてください!