こんにちは、サービス onstart() にリマインダー コードを書きました。ユーザーが日付時刻を挿入し、その時刻にレコードを挿入すると、サービスは startservice() 関数によって呼び出されますが、レコードを挿入するとサービスのみが開始されます。アクティビティから呼び出しますが、3 日後か何か後にリマインダーが欲しいのですが、将来リマインダーを受け取ることができるように、サービスを常にオンにしておくにはどうすればよいですか? または、サービスの接続を維持するにはどうすればよいですか?私の任意のアクティビティから bindservice() frunction を呼び出す必要がありますか? 前もって感謝します - -
3 に答える
サービスを常に実行させないでください。必要でないときは、バッテリーとメモリを消費します¹。代わりに、関連する時点でサービスを開始してその作業を行うAlarmManagerPendingIntent
を介してスケジュールします。完了したら、サービスを再度終了します。
一般に、Android サービスは、「通常の」コンピューター上のサービス/デーモンとは異なる方法で使用されます。彼らには実行するタスクがあり、その後、誰かが再び作業を開始するまで(通常は を介してService.stopSelf()
)終了します。
以下は、AlarmManager の使用方法の小さな例です。
// get a calendar with the current time
Calendar cal = Calendar.getInstance();
// add 15 minutes to the calendar object
cal.add(Calendar.MINUTE, 15);
Intent intent = new Intent(ctx, YourService.class);
PendingIntent pi = PendingIntent.getService(this, 123, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
YourService
これにより、今から 15 分後に開始するインテントが起動されます。この方法でインテントを送信するためのドキュメントはたくさんあります。少し調べてみてください。
¹ 「なぜこのアプリはバッテリーを浪費するのですか?」とユーザーを苛立たせます。はよくある質問です
場合によっては、Androidアプリが将来タスクを完了する必要があるかもしれません。これを行うには、AndroidのAlarmManagerを使用して実行するアクティビティ(サービスの場合もあります)をスケジュールする必要があります。この投稿は次のように表示されます。
* How to set up a receiver for the scheduled event
* How to create an activity from this receiver
* Using the AlarmManager and the created classes to successfully receive and process a scheduled event
BroadcastReceiverの作成
最初に必要なのは、イベントを受信するためのレシーバーです。受信機が正しく機能するために必要ないくつかの重要な側面があります。まず、BroadcastReceiverを拡張するクラスを作成し、必要なonReceive(Context context、Intent intent)メソッドをオーバーライドして実装します。以下は、トーストメッセージを使用した基本的な例です。
package com.justcallmebrian.alarmexample;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import android.os.Bundle;
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
try {
Bundle bundle = intent.getExtras();
String message = bundle.getString("alarm_message");
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
前の例では、alarm_messageという名前で渡された文字列によって提供されたメッセージを単に出力しています。Toastに慣れていない人のために、それは基本的にユーザーに与えられる短くて速いメッセージです。ここでは、トーストに関する詳細情報を見つけることができます。
イベントを受信するクラスを実際に作成するだけでなく、AndroidManifest.xml内で宣言する必要もあります。以下は、アプリケーションタグを閉じる前(前)に追加する必要がある行です。
基本的に、これはクラスAlarmReceiverが使用可能であり、プライベートプロセスを開始することを示しています。これが完了すると、BroadcastReceiverを使用できるようになります。
AlarmManagerを使用したイベントの設定イベントを 受信するには、明らかにイベントをスケジュールする必要があります。イベントをスケジュールする方法は3つあります(setメソッドを使用した1回限りのイベント、setRepeatingメソッドを使用した繰り返しイベント、最後にsetInexactRepeatingを使用したイベント)。このチュートリアルでは、setメソッドを使用した1回限りのアラームについて説明します。その他のイベントの詳細については、AlarmManagerを参照してください。
次のコードスニペットは、AlarmManagerを取得し、現在の時刻から5分後に発生するようにイベントを設定します。
// get a Calendar object with current time
Calendar cal = Calendar.getInstance();
// add 5 minutes to the calendar object
cal.add(Calendar.MINUTE, 5);
Intent intent = new Intent(ctx, AlarmReceiver.class);
intent.putExtra("alarm_message", "O'Doyle Rules!");
// In reality, you would want to have a static variable for the request code instead of 192837
PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Get the AlarmManager service
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender);
このコードスニペットは基本的に新しいCalendarオブジェクトを取得し、それに5分を追加します。インテントは、前に作成したAlarmReceiverを使用して作成されます。コードのより重要な部分は、FLAG_UPDATE_CURRENTフラグを設定することです。このフラグがないと、Extraとして渡されたメッセージは失われ、受信者は取得できません。
これらのコードスニペットを使用すると、BroadcastReceiverでいくつかのタスクを作成して実行できるはずです。ただし、アラームイベントで新しいアクティビティ(またはサービス)を開始したい場合があります。これを行うには、AlarmReceiverで新しいアクティビティを作成して開始する必要があります。
BroadcastReceiverからのアクティビティの 開始Receiver内でアクティビティを開始すると、必要な追加のフラグがあります。これを行うために、AlarmReceiverの以前のonReceiveを変更します。
@Override
public void onReceive(Context context, Intent intent) {
try {
Bundle bundle = intent.getExtras();
String message = bundle.getString("alarm_message");
Intent newIntent = new Intent(context, AlarmActivity.class);
newIntent.putExtra("alarm_message", message);
newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(newIntent);
} catch (Exception e) {
Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
これで、他のアクティビティと同じように、新しいAlarmActivityを作成するだけで済みます。新しく作成されたアクティビティをAndroidManifest.xmlファイルに含めることを忘れないでください。
まず、サービスは必要ありません。AlarManagerClass Link Alarmanger クラスを使用してイベントをスケジュールし、特定の日時にアラートを表示できます。長時間の後にメッセージを表示したい場合は、AlarmManager を介して Pending-intent をスケジュールし、関連する時点でサービスを開始して作業を実行します。完了したら、上記の回答で伝えるように、サービスを再度強制終了します。さらに、データを共有設定に永久に保存できます。デバイスの再起動やその他の目的で、いつでも取得できます。