バックグラウンドで毎分タスクを実行したいサービスがあります。ユーザーがアクティブに使用している場合にのみ、電話がスリープ状態のときにタスクを実行する必要はありません。私は次のように設定されているIntentServiceでこれを実行しようとしています:
_public class CounterService extends IntentService{
public CounterService() {
super("CounterService");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent,flags,startId);
}
@Override
protected void onHandleIntent(Intent intent) {
Toast.makeText(this, "onhandleintent", Toast.LENGTH_SHORT).show();
while(true)
{
//one minute is 60*1000
try {
Thread.sleep(5 * 1000);
Toast.makeText(getApplicationContext(), "getting app count", Toast.LENGTH_LONG).show();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
_
現在、機能を動作させるには、トーストを5秒ごとに表示したいだけです。1分後にトーストを変更します。 while(true)
をコメント化すると、「onhandleintent」メッセージが表示されます。ただし、次のコードを実行すると、どちらのトーストも表示されません。どうすれば修正できますか?
これにより、アクティビティのプロセッサ時間を使用せずに、毎分サービスにインテントが送信されます
Intent myIntent = new Intent(context, MyServiceReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 60); // first time
long frequency= 60 * 1000; // in ms
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), frequency, pendingIntent);
MyServiceReceiver.classを調整して、ターゲットのサービスまたはアクティビティに一致させます。 documentation は、正確なタイミングが必要かどうか、1日の特定の時間に実行するかどうかなど、呼び出しを微調整するための詳細を提供します...
ANRのリスクを回避するには、メインスレッドを終了する必要があります。
代わりにハンドラを追加します
Handler mHandler = new Handler();
...
@Override
protected void onHandleIntent(Intent intent) {
Toast.makeText(this, "onhandleintent", Toast.LENGTH_SHORT).show();
mHandler.postDelayed( ToastRunnable, 5000);
//while(true)
//{
//one minute is 60*1000
//try {
// Thread.sleep(5 * 1000);
// Toast.makeText(getApplicationContext(), "getting app count",
//Toast.LENGTH_LONG).show();
//} catch (InterruptedException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
//}
//}
}
final Runnable ToastRunnable = new Runnable(){
public void run(){
Toast.makeText(getApplicationContext(), "getting app count",
Toast.LENGTH_LONG).show();
mHandler.postDelayed( ToastRunnable, 5000);
}
}
このようにしてください
private void ping() {
try {
//Your code here or call a method
} catch (Exception e) {
Log.e("Error", "In onStartCommand");
e.printStackTrace();
}
scheduleNext();
}
private void scheduleNext() {
mHandler.postDelayed(new Runnable() {
public void run() { ping(); }
}, 60000);
}
public int onStartCommand(Intent intent, int x, int y) {
mHandler = new Android.os.Handler();
ping();
return START_STICKY;
}