0
public class MyHibernatedService extends Service{ 
     public void onCreate() {
        super.onCreate();
        //declaring the intents ..
        //some codes...

        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, IntentServiceToBeRun, 0);
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MILLISECOND, 10000);  
        am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
        }
}

毎日特定の時間Serviceに起動したい。IntentServiceただし、インターネット、StackOverflow、Google などのどこかで読んだことがあります。Service永遠に生き続けることはできません。これが Android のしくみです。ServiceAndroid がメモリを必要としたり、メモリを使いすぎたりするたびに、それを強制終了する必要があります。このコードが毎日実行され、私Serviceが殺されないことを保証するものは何ですか?

編集 :

私はAndroidのドキュメントで気づいた:

Android システムは、サービスが開始されているかクライアントがバインドされている限り、サービスをホストするプロセスを維持しようとします。

「それにバインドされたクライアント」とは実際にはどういう意味ですか?

4

2 に答える 2

0

実際にサービスを存続させる必要はありません。ここではAlarmManager、電話がスリープ状態であっても、時間になると IntentService を起動できるように設定しています。このサービスは、あなたの仕事ではなく、仕事をします。

このコードが毎日実行され、サービスが強制終了されないことを保証するものは何ですか?

で提供したコードはMyHibernatedService、アラームを設定するために 1 回だけ実行する必要があり、それ以降は必要ありません。それが唯一のことである場合MyHibernatedService、それはまったく必要ありません。

たとえば、インテント サービスでアラームを設定する静的メソッドを作成し、必要に応じてどこからでも呼び出すことができます (おそらく、開始した場所MyHibernatedService)。

また、インテント サービスの開始時に信じられないほどの精度が必要ない場合は、setInexactRepeating()代わりにsetRepeating().

于 2013-04-25T17:10:46.877 に答える
0

独自のサービスを使用して定期的に別のサービスを開始するのではなく、代わりにサービスを使用してAlarmManagerください (既に行っているように)。この 2 番目のサービス IMHO は必要ありません。

AlarmManagerシステム サービスであり、Android によって強制終了されることはありません。独自のサービスが行うこととまったく同じことを既に実行しています。つまり、定期的に (または指定された時間に単発で) 開始します。

「それにバインドされたクライアント」について: トピック外ですが、他のコンポーネント (他のサービスやアクティビティなど) が への呼び出しを使用して接続されていることを意味しContext.bindService()ます。詳しくは開発ガイドをご確認ください。

于 2013-04-25T11:23:08.523 に答える