私の質問はです。
Androidには、携帯電話を再起動しても、タスクが実行されなくなるまで存続できるサービスを作成する方法があります。
たとえば、アラームアプリケーション。モバイルを再起動すると、問題なくトリガーされます。
Androidでは、すべてのサービスがこのように動作しますか、それともそのための解決策がありますか?
詳しく説明してください。
携帯電話を再起動しても存続できるサービスを作成する方法はありますか
いいえ。電話の電源を切ると、実行中のすべてのサービスが強制終了されます。
たとえば、アラーム アプリケーション。モバイルを再起動すると、問題なくトリガーされます。
はい。ただし、サービスが存続したためではありません。目覚ましアプリがandroid.intent.action.BOOT_COMPLETED
インテントに反応するからです。
できることは、このインテントに応答してサービスを開始する BoradcastReceiver を作成することです。
問題は、ユーザーがこのサービスを手動で強制終了できることです。目覚まし時計を作成する場合は、サービスを常にバックグラウンドで実行するべきではありません。
AlarmManagerとPendingIntentを利用する必要があります。
あなたのマニフェストのようなもの:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name=".broadcasts.InitReceiver"
android:exported="false" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.TIME_SET" />
<action android:name="android.intent.action.TIMEZONE_CHANGED" />
</intent-filter>
</receiver>
そして、放送用にこんなもの。
public class InitReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Schedule your alarms again.
}
}
そして、次のようにアラームをスケジュールする必要があります:
Intent intent = new Intent(context, Ring.class);
intent.setData(alarmUri);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP, ringTime, pendingIntent );
Ring
アラーム リングを処理するブロードキャストはどこにありますか。
2 つのステップが必要です。
(1) 最初に BroadcastReceiver を作成し、このレシーバーの onReceive() メソッドでサービスを開始します。
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, YourService.class);
context.startService(service);
}
}
(2) 次に、このレシーバーをマニフェストに次のように宣言します。
<receiver android:name=".MyReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
このようにして、サービスは常に実行され、電話が再起動されても開始されます. 詳細については、次のリンクを参照してください。
http://www.vogella.com/articles/AndroidServices/article.html
Android では、携帯電話を再起動しても、そのタスクが実行されなくなるまで存続できるサービスを作成する方法があります。
いいえ、あなたの要求を文字通りに解釈する場合。デバイスの電源を切るとすべてのプロセスが終了するのと同様に、デバイスを再起動するとすべてのプロセスが終了します。
たとえば、アラーム アプリケーション。モバイルを再起動すると、問題なくトリガーされます。
これは、「アラーム アプリケーション」が を介して起動時に制御を取得し、 を使用ACTION_BOOT_COMPLETED
BroadcastReceiver
してアラームのスケジュールを変更しているためAlarmManager
です。
同様に、ダウンロード キューを実装するサービスは、起動時に を介して制御を取得し、ACTION_BOOT_COMPLETED
BroadcastReceiver
その時点でまだダウンロードする必要があるものを判断し、その作業に戻ります。
サービスのドキュメントを確認してください。メモリ不足などでサービスが終了した場合に、システムにサービスを再起動させるSTART_STICKYフラグが必要です。
デバイスの再起動を処理するには...
マニフェスト
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<service
android:name=".BootService"
android:label="Boot Service" >
<intent-filter>
<action android:name="com.my.package.BootService" />
</intent-filter>
</service>
<receiver
android:name=".receiver.BootReceiver"
android:enabled="true"
android:exported="true"
android:label="Boot Receiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
ソース
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(this.getClass().getName(), "Boot Receiver onReceive()");
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()))
{
// Fire up your service.
Intent serviceIntent = new Intent("com.my.package.BootService");
serviceIntent.putExtra(Constants.BOOT_LAUNCH_EXTRA, true);
context.startService(serviceIntent);
}
}
}
public class BootService extends IntentService {
public BootService()
{
super("BootService");
}
@Override
protected void onHandleIntent(Intent intent) {
Log.d(this.getClass().getName(), "Boot Service onHandleIntent()");
if(intent.hasExtra(Constants.BOOT_LAUNCH_EXTRA))
{
//...
}
}
}