Androidのドキュメントでこの行が何を意味するのか知っている人はいますか(ここにリンクの説明を入力してください): "
注: Activity.onResume() 実装でレシーバーを登録する場合は、Activity.onPause() で登録を解除する必要があります。(一時停止するとインテントを受信しなくなり、不要なシステム オーバーヘッドが削減されます)。
最初の文は明確です。リソースが必要ない場合は、リソースを解放する必要があります。しかし、括弧付きのテキストはどうでしょうか? どうやらバックグラウンドのアプリは、停止するとブロードキャストインテントを受け取ります (少なくとも Android 4.2 では)。破壊されるとブロードキャストを取得できません。試すコード:
public class MyActivity extends Activity {
private BroadcastReceiver mBroadcastReceiver;
String a = "1234";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("|BR", "onReceive() - 1" + " intent: " + intent);
a = intent.getStringExtra("ASDF");
}
};
this.registerReceiver(mBroadcastReceiver, new IntentFilter(MyService.RECEIVE));
}
@Override
protected void onResume() {
super.onResume();
Log.d("|BR", "onResume()" + " a: " + a);
}
@Override
protected void onPause() {
super.onPause();
Log.d("|BR", "onPause()");
}
/** Event handler for a button in the main.xml */
public void createService(View view) {
Log.d("|BR", "createService()");
Intent intent = new Intent(MyService.DO);
this.startService(intent);
}
}
public class MyService extends Service {
public static final String DO = MyService.class.getName() + ".DO";
public static final String RECEIVE = MyService.class.getName() + ".RECEIVE";
public Executor executor;
@Override
public void onCreate() {
super.onCreate();
executor = Executors.newSingleThreadExecutor();
}
@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {
String action = intent.getAction();
Log.d("|BR", "onStartCommand() - 1");
if(DO.equals(action)) {
executor.execute(new MyRunnable());
Log.d("|BR", "onStartCommand() - 2");
}
return START_NOT_STICKY;
}
@Override
public android.os.IBinder onBind(final Intent intent) {
return null;
}
private class MyRunnable implements Runnable {
@Override
public void run() {
Log.d("|BR", "run() - 1");
try {
Thread.sleep(1000 * 8);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("|BR", "run() - 2");
Intent intent = new Intent(RECEIVE);
intent.putExtra("ASDF", "QWER");
MyService.this.sendBroadcast(intent);
Log.d("|BR", "run() - 3");
}
}
}
ボタンを押して、ホームボタンを押して、8 秒待ちます。結果:
09:05:48.622 D/|BR: onResume() a: 1234
09:05:53.297 D/|BR: createService()
09:05:53.297 D/|BR: onStartCommand() - 1
09:05:53.307 D/|BR: onStartCommand() - 2
09:05:53.307 D/|BR: run() - 1
09:05:54.558 D/|BR: onPause()
09:06:01.306 D/|BR: run() - 2
09:06:01.316 D/|BR: onReceive() - 1 intent: Intent { act=com.example.broadcastReceive.MyService.RECEIVE flg=0x10 (has extras) }
09:06:01.316 D/|BR: run() - 3
09:06:14.139 D/|BR: onResume() a: QWER