シナリオは次のとおりです。ネットワークコンピューターまたはクラウドへのバックアップを行うWakefulBroadcastReceiverがあります。タブレットがLANにアクセスできることがわかっている深夜にオフになるように設定されています。バックアップは、ストレージアクセスフレームワークを使用して、WakefulBroadcastReceiverをインスタンス化したフラグメントによって「選択」された場所とファイルにデータを保存します。そのため、ContentResolverにアクセスできるようにする必要があり、そのためにはコンテキストが必要です。
私がドキュメントを読んでいる限り、これがBroadcastReceiverの使用目的です。他にあまり起きていないときにバックグラウンドで実行される潜在的に長時間実行されるタスクです。 -バックアップのように。私はすべてをまとめた例を見たことがありません。
IntentServiceでコンテキストを取得するにはどうすればよいですか?以下は、レシーバーとスケジューリングサービスのスニペットです。
public class BackupAlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent service = new Intent(context, BackupSchedulingService.class);
startWakefulService(context, service);
}
}
public class BackupSchedulingService extends IntentService {
public BackupSchedulingService() {
super("BackupSchedulingService");
}
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
// How to get the context - it was a parameter when
// creating the new IntentService class above?
}
}
サンプルコードは、Androidここにあるリファレンスマニュアルのコードとほぼ同じです:
https://developer.Android.com/reference/Android/support/v4/content/WakefulBroadcastReceiver.html
だから私の質問は、IntentServiceでどのようにコンテキストを取得するのですか?
IntentService
はContext
を継承するため、IntentService
はContext
です。
getApplicationContext()
を呼び出すだけです
OnStartCommand()関数でコンテキストを取得できます。
public class ExampleService extends IntentService {
private Context mContext;
public ExampleService(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mContext = getApplicationContext();
return super.onStartCommand(intent, flags, startId);
}
}
BackupSchedulingService.this(ServiceName.this)を使用してコンテキストを取得します
理由:サービスがContextWrapperを拡張
ContextWrapperはコンテキストを拡張します
Intentサービスクラスをコンテキストとして使用できます。これは IntentService クラスの階層であるためです。
InJava
BackupSchedulingService.this
そしてKotlin
this@BackupSchedulingService
これが将来の開発者に役立つことを願っています...