0

こんにちはstackoverflow、特定の時間間隔でいくつかのタスクを実行できる Android アプリケーションを開発しようとしています。タスクを実行AlarmManagerするために使用しています。コード スニペットは次のとおりです。

if (radioBtnChecked)
{   
     MyActivity.this.alarmMgr = (AlarmManager) MyActivity.this.getSystemService(Context.ALARM_SERVICE);
     Intent serviceIntent = new Intent(MyActivity.this, MyService.class);
     MyActivity.this.pi = PendingIntent.getService(MyActivity.this, 0, serviceIntent, 0);
     MyActivity.this.alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 10000, pi);

 }//End of if condition

MyService.java

public class MyService extends Service 
{
    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }//End of onBind method

    public void onStart(Intent intent, int startId) 
    {
        super.onStart(intent, startId);
        Toast.makeText(getApplicationContext(),"Service started", Toast.LENGTH_SHORT).show();
    }
}

問題は、Service startedラジオボタンをクリックしたときに初めてService startedメッセージが表示されることですが、10 seconds. 誰かがこの問題を解決するのを手伝ってください。間違いを修正できるように知識を共有してください。

前もって感謝します。

4

4 に答える 4

5

次のように AlarmManager を設定します。

private static final int REPEAT_TIME_IN_SECONDS = 60; //repeat every 60 seconds

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
            REPEAT_TIME_IN_SECONDS * 1000, pendingIntent);

オフになったときに電話をウェイクアップする場合に変更AlarmManager.RTCします。AlarmManager.RTC_WAKEUPAlarmManager の詳細はこちら

これら 2 つのパラメーターは、アラーム時刻がSystem.currentTimeMilis()UTC の時刻になることも意味します。

編集 :

AlarmManager.ELAPSED_REALTIMEスリープを含むデバイスの起動からの時間を測定するソリューション。これは、このコードを 10 秒後に実行してから繰り返したい場合、デバイスがそれ以上実行されている場合、起動後 10 秒が経過しているため、PendingIntent がすぐにトリガーされることを意味します。

編集2:

10 秒後に 1 回だけコードを実行したい場合は、次のようにします。

private static final int START_AFTER_SECONDS = 10;
...
if (radioBtnChecked)
{ 
    Runnable mRunnable;
    Handler mHandler = new Handler();
    mRunnable = new Runnable() {
        @Override
        public void run() {
            Intent serviceIntent = new Intent(MyActivity.this, MyService.class);
            MyActivity.this.startService(serviceIntent);
        }
    };
    mHandler.postDelayed(mRunnable, START_AFTER_SECONDS * 1000);
}
于 2013-09-26T07:03:10.037 に答える
0

SystemClock.elapsedRealtime()と置き換えますSystem.currentTimeMillis()

于 2013-09-26T08:21:03.063 に答える
0

このコード スニペットはあなたを助けるかもしれません

 private static final long REPEAT_TIME = 30*1000;  
  AlarmManager service = (AlarmManager) context
                .getSystemService(Context.ALARM_SERVICE);
            Intent i = new Intent(context, MyStartServiceReceiver.class);
            PendingIntent pending = PendingIntent.getBroadcast(context, 0, i,
                PendingIntent.FLAG_CANCEL_CURRENT);
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.SECOND, 30);
            service.setInexactRepeating(AlarmManager.RTC_WAKEUP,cal.getTimeInMillis(), REPEAT_TIME, pending);

MyService クラスで を使用しますonStartCommand(Intent intent, int flags, int startId)。一度実行される onStart(Intent intent, int startId) を使用しました。

public class MyService extends Service 
{
    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }//End of onBind method

    public void onStart(Intent intent, int startId) 
    {
        super.onStart(intent, startId);
        Toast.makeText(getApplicationContext(),"Service started", Toast.LENGTH_SHORT).show();
    }

@Override
    public int onStartCommand(Intent intent, int flags, int startId)
    {
         Toast.makeText(getApplicationContext(),"onStartCommand=Service started", Toast.LENGTH_SHORT).show();        
        return Service.START_STICKY;
    }
}
于 2013-09-26T07:04:53.423 に答える
0

これで試してください

alarmManagera.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),10000, YourPendingIntent);
于 2013-09-26T06:32:48.640 に答える