6

このように Groups.class アクティビティの onCreate で AlarmManager によって 20 秒ごとに呼び出される Service "GroupsTaskAlarmChecker" があります。

int seconds = 20;

           Intent myIntent = new Intent(Groups.this, GroupsTaskAlarmChecker.class);
           pendingIntent = PendingIntent.getService(Groups.this, 0, myIntent, 0);

           AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

           Calendar calendar = Calendar.getInstance();
           calendar.setTimeInMillis(System.currentTimeMillis());
           calendar.add(Calendar.SECOND, 10);
           alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), seconds * 1000, pendingIntent);

これは完全に機能します。しかし、デバイスの起動時にそれを行う必要があります。次に、次のように AndroidManifest を作成する必要があることを知っています。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 <receiver android:name=".ReceiverBoot">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED">
            <category android:name="android.intent.category.HOME">
        </category></action></intent-filter>
    </receiver>

そして、mi broadcastReceiver を次のようにします。

 public class ReceiverBoot extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    int seconds = 20;

        Intent myIntent = new Intent(context, GroupsTaskAlarmChecker.class);
        pendingIntent = PendingIntent.getService(context, 0, myIntent, 0);

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 10);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), seconds * 1000, pendingIntent);

    }
}

しかし、この onReceive 内では、以前と同じことを行う方法がわかりません (20 秒ごとにサービスを開始する意図と alarmManager を使用)。この行のエラー:

 AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);

BroadcastReceiver内でAlarmManagerを作成できない可能性はありますか?

私は Android のビギナーであり、あなたの助けが必要です。私の英語でごめんなさい;)

4

4 に答える 4

2

これは、この質問の目標を達成するためのより完全なビジョンを追加できると私が信じている小さな貢献です。

最初: アプリから AndroidManifest 内に「レシーバー」を構成します。

<receiver
    android:name=".AlarmBroadcastReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

2 番目: 抽象クラス BroadcastReceiver を拡張するクラスでは、インテント アクションが「BOOT_COMPLETED」であったかどうかを判断する必要があります。条件が満たされている場合は、アラームに対するすべての構造を持つクラスからメソッドを呼び出すことができます。

以下のスニペットを参照してください。

public class AlarmBroadcastReceiver extends BroadcastReceiver {

    String TAG   = "ALARMS";
    String CLASS = this.getClass().getSimpleName() + ": ";

    Context alarmContext;

    @Override
    public void onReceive(final Context context, Intent intent) {

        Log.d(TAG, CLASS + "[START] onReceive()... ");

        alarmContext = context;

        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Log.d(TAG, CLASS + "BOOT_COMPLETED action has been received.");
            setAlarmOnBoot();
        }

            Log.d(TAG, CLASS + "[END] onReceive()... ");

    }

    public void setAlarmOnBoot() {

        Log.d(TAG, CLASS + "[START] - setAlarmOnBoot()");

        final long beginAt  = SystemClock.elapsedRealtime() + 60 * 1000;
        final long interval = 300000; // 5 minutes

        try {
            AlarmManager alarm    = (AlarmManager)  alarmContext.getSystemService(Context.ALARM_SERVICE);
            Intent intent         = new Intent(alarmContext, AlarmBroadcastReceiver.class);
            PendingIntent pIntent = PendingIntent.getService(alarmContext, 0, intent, 0);
            alarm.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, beginAt, interval, pIntent);
            Log.d(TAG, CLASS + "the Alarm has been configured successfully (5 minutes) of interval.");
        } catch (Exception e) {
            Log.d(TAG, CLASS + "an exception has ocurred while setting the Alarm...");
            e.printStackTrace();
        }  

        Log.d(TAG, CLASS + "[END] - setAlarmOnBoot()");

    }

}
于 2016-12-06T01:20:44.660 に答える
2

ALARM_SERVICE はクラス ReceiverBoot でも BroadcastReceiver でも定義されていません。

getSystemService(String) の引数として Context.ALARM_SERVICE を参照する必要があります。

于 2013-03-05T16:11:12.640 に答える
0

あなたのonReceiveで:

if ("android.intent.action.BOOT_COMPLETED".equals (intent.getAction())){

   //start it again here

}
于 2013-03-05T10:54:31.157 に答える