2

バックグラウンドで実行され、(最終的に) 保存イベントをトリガーするアラームを設定しようとしています。現時点では、このコードをボタンに添付するだけです。ボタンを押すと、アラームが機能していることを示すトースト メッセージを残し始めます。現時点では、BroadcastReceiver の onReceive がトリガーされないことを除いて、すべてが実行されます。

これが私のコードです:

アラームを設定するクラス:

//FIXME - rename (ie BackgroundSave; more descriptive)
public class AlarmReceiver extends Service{

    //FIXME - make sure you kill the service
    public void onCreate() {
        super.onCreate();
        Toast.makeText(getApplication().getApplicationContext(), "Service onCreate called", Toast.LENGTH_SHORT).show();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(getApplication().getApplicationContext(), "Service started", Toast.LENGTH_SHORT).show();
        setAlarm(AlarmReceiver.this);
        // We want this service to continue running until it is explicitly
        // stopped, so return sticky.
        return START_STICKY;
    }

    public void setAlarm(Context c) {
        AlarmManager alarmManager = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(c, Alarm.class);
        PendingIntent pi = PendingIntent.getBroadcast(c, 0, i, 0);
        alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis() + 1000, 1000, pi);
        Toast.makeText(c.getApplicationContext(), "setAlarm called", Toast.LENGTH_SHORT).show();
    }

    public void cancelAlarm(Context context) {
        Intent intent = new Intent(context, Alarm.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
}

これが BroadcastReceiver です。

public class Alarm extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "Alarm", Toast.LENGTH_SHORT).show();
    }

}

そして、ここに私のマニフェストがあります:

<!-- Alarm -->
        <service android:name="com.xxxx.android.tools.AlarmReceiver" android:enabled="true" />
        <receiver android:name="com.xxxx.android.tools.Alarm" ></receiver>

アラーム onReceive がトリガーされることはありません。

4

1 に答える 1

1

AlarmManager.ELAPSED_REALTIME_WAKEUP を使用するときは、android.os.SystemClock.elapsedRealtime() を基準時間として使用する必要があります。

つまり、節約の目的で AlarmManager を使用することは最善の方法ではないと思います。アラーム マネージャはかなり重いです。シンプルなハンドラーを使用して保存アクションをトリガーすることを検討する必要があります。

Handler.postAtTime() を見てください。

于 2012-06-10T16:37:04.790 に答える