web-dev-qa-db-ja.com

毎日正午に、そしてすべての起動時にサービスを実行する方法

私のアプリには、ミリ秒単位の日付行を持つ1つのテーブルを持つSQLiteデータベースがあります。毎日通知を表示したい[〜#〜] if [〜#〜]データベースに保存されている最後の日付値から30日が経過しました。サービスは、このチェックを実行するための良い方法のようです。

CommonswareのWakefulIntentServiceに出くわし、それが答えになると思いましたが、どうすれば実装すればよいのか本当にわかりません。デモでは、起動が完了してから5分後にサービスを開始します。これは問題ありませんが、正午ごとに開始するには何を追加する必要がありますか。 (...ただし、起動時と定期的な毎日のチェックのように、両方ではなく、1日に1つの通知のみを表示します)

これはAlarmManagerを使用して解決できることは知っていますが、実際には方法がわかりません。だから、私が必要とする助けは、アプリを実行せずにすべての起動時および/または毎日サービスを開始するためのいくつかのサンプル/キーポイントを私に与えることです。

ありがとう

15
micadelli

Androidのalarmmanagerがあなたの答えです。電話の目覚ましのアラームもリセットする放送受信機で使用してください。

コード例:メソッド内のアラームの設定:

Intent intent = new Intent(context, AlarmReceiver.class);
intent.setAction("packagename.ACTION");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
            0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
        AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pendingIntent);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

あなたの間隔の受信機:

public class AlarmReceiver extends BroadcastReceiver {
private final String SOMEACTION = "packagename.ACTION"; //packagename is com.whatever.www
@Override
public void onReceive(Context context, Intent intent) {
    Time now = new Time();
    now.setToNow();
    String time = FileHandler.timeFormat(now);

    String action = intent.getAction();
    if(SOMEACTION.equals(action)) {
        // here you call a service etc.
    }

電話がシャットダウンされたときにアラームをリセットするための受信機。

public class AlarmSetter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // get preferences
        SharedPreferences preferences = context.getSharedPreferences("name_of_your_pref", 0);
        Map<String, ?> scheduleData = preferences.getAll();

        // set the schedule time
        if(scheduleData.containsKey("fromHour") && scheduleData.containsKey("toHour")) {
            int fromHour = (Integer) scheduleData.get("fromHour");
            int fromMinute = (Integer) scheduleData.get("fromMinute");

            int toHour = (Integer) scheduleData.get("toHour");
            int toMinute = (Integer) scheduleData.get("toMinute");

            //Do some action
        }
    }

}

マニフェストは非常に重要です。これはアプリケーションの下に追加されます。

        <receiver Android:name="AlarmReceiver">
        <intent-filter>
            <action Android:name="packagename.ACTION"/>
            <action Android:name="packagename.ACTION2"/>
        </intent-filter>
    </receiver>

    <receiver Android:name="AlarmSetter" >
        <intent-filter>
            <action
                Android:name="Android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

また、これを機能させるには、次の行を使用して、マニフェストでブートブロードキャストを受信するためのアクセス許可を追加する必要があります。

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />

エラーがあれば、これで問題が解決したことを願っています。

編集(アラームセッターの例を追加):

public class AlarmSetter extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // Do your stuff
    }
}
41
Warpzit

この答えはかなり古いようです。さて、Googleが提供するSyncAdapterフレームワークをチェックすることを強くお勧めします。そんなもののためにカスタムメイドされています。リンクは次のとおりです: https://developer.Android.com/training/sync-adapters/index.html

5
Ankit

デモでは、起動が完了してから5分後にサービスを開始します。これは問題ありませんが、正午ごとに開始するには何を追加する必要がありますか。

setRepeating()呼び出しの初期時間を変更します。この例は、今から1分後を示しています。次の正午がいつであるかを判断するには、計算を行う必要があります。

この種の計算の例は、別のサンプルプロジェクトの this OnBootReceiver にあります。ここでは、ユーザーが指定した時間に毎日アラームが鳴るように設定しています。

2
CommonsWare