0

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
4

2 に答える 2

2

で を登録解除した場合、ブロードキャストを受信しないことを意味しBroadcastReceiverますonPause()

于 2013-10-02T09:25:26.583 に答える
0

受信機で何をするかによっては、CPU/バッテリーを非常に消費する可能性があります。もしそうなら、あなたはそれをできるだけめったに実行しないことを望んでおり、それがこの文が言いたいことです.

GPS 情報を受信するコードを実行したことがありますか? バッテリーを最大 2 時間使用できます。したがって、これがオンになっていると、毎秒がカウントされます。この機能をオン/オフするのに最適な場所ですonResume。、またはをonPause使用すると、機能が必要以上に長くオンになる (そしてバッテリーを消費する) ことになります。onStartonStoponCreateonDestroy

于 2013-10-02T09:25:40.700 に答える