3

私の質問はです。

Androidには、携帯電話を再起動しても、タスクが実行されなくなるまで存続できるサービスを作成する方法があります。

たとえば、アラームアプリケーション。モバイルを再起動すると、問題なくトリガーされます。

Androidでは、すべてのサービスがこのように動作しますか、それともそのための解決策がありますか?

詳しく説明してください。

4

4 に答える 4

2

携帯電話を再起動しても存続できるサービスを作成する方法はありますか

いいえ。電話の電源を切ると、実行中のすべてのサービスが強制終了されます。

たとえば、アラーム アプリケーション。モバイルを再起動すると、問題なくトリガーされます。

はい。ただし、サービスが存続したためではありません。目覚ましアプリがandroid.intent.action.BOOT_COMPLETEDインテントに反応するからです。

できることは、このインテントに応答してサービスを開始する BoradcastReceiver を作成することです。

問題は、ユーザーがこのサービスを手動で強制終了できることです。目覚まし時計を作成する場合は、サービスを常にバックグラウンドで実行するべきではありません。

AlarmManagerPendingIntentを利用する必要があります。

あなたのマニフェストのようなもの:

<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アラーム リングを処理するブロードキャストはどこにありますか。

于 2012-10-26T14:24:36.527 に答える
2

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

于 2012-10-26T14:23:11.840 に答える
0

Android では、携帯電話を再起動しても、そのタスクが実行されなくなるまで存続できるサービスを作成する方法があります。

いいえ、あなたの要求を文字通りに解釈する場合。デバイスの電源を切るとすべてのプロセスが終了するのと同様に、デバイスを再起動するとすべてのプロセスが終了します。

たとえば、アラーム アプリケーション。モバイルを再起動すると、問題なくトリガーされます。

これは、「アラーム アプリケーション」が を介して起動時に制御を取得し、 を使用ACTION_BOOT_COMPLETED BroadcastReceiverしてアラームのスケジュールを変更しているためAlarmManagerです。

同様に、ダウンロード キューを実装するサービスは、起動時に を介して制御を取得し、ACTION_BOOT_COMPLETED BroadcastReceiverその時点でまだダウンロードする必要があるものを判断し、その作業に戻ります。

于 2012-10-26T14:23:17.620 に答える
0

サービスのドキュメントを確認してください。メモリ不足などでサービスが終了した場合に、システムにサービスを再起動させる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))
    {
                 //...
    }
}

}
于 2012-10-26T14:21:48.280 に答える