具有ResultReceiver和生命周期的BroadcastReceiver

时间:2014-04-07 09:54:29

标签: android android-intent broadcastreceiver android-service

我有关于使用带有ResultReceiver的BroadcastReceiver的方法的询问。

我知道如果“一个BroadcastReceiver还没有在10秒内完成执行。”,就会有一个ANR。

我有一个应用程序响应在Manifest中声明的Intent。 它是一个启动服务的BroadcastReceiver,因为它需要进行一些网络操作:

public class MyReceiver extends BroadcastReceiver {

    private Context context = null;
    private MyResultReceiver myResultReceiver = null;

    @Override
    public void onReceive(Context context, Intent intent) {

        this.context = context;
        myResultReceiver = new MyResultReceiver(new Handler());

        Intent i = new Intent();
        i.setClass(context, MyService.class);
        i.putExtra(Constants.EXTRA_RESULT_RECEIVER, myResultReceiver);
        context.startService(i);
    }

    public class MyResultReceiver extends ResultReceiver {

        public MyResultReceiver(Handler handler) {
            super(handler);
        }

        @Override
        protected void onReceiveResult(int resultCode, Bundle resultData) {
            if (resultCode == 42) {
                // Something
            } else {
                // Something else
            }
        }
    }
}

我的服务如下:

public class MyService extends Service {

    private Context context = null;
    private ResultReceiver resultReceiver = null;

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        this.context = this;
        resultReceiver = intent.getParcelableExtra(Constants.EXTRA_RESULT_RECEIVER);
        MyTask myTask = new MyTask();
        myTask.execute();
        return super.onStartCommand(intent, flags, startId);
    }

    public class MyTask extends AsyncTask<Void, Void, Boolean> {

        @Override
        protected Boolean doInBackground(Void... params) {
            // Network operation
            return status;
        }

        @Override
        protected void onPostExecute(final Boolean status) {
            Bundle bundle = new Bundle();
            if (status == true) {
                if (resultReceiver != null) {
                    resultReceiver.send(42, null);
                }
            } else {
                if (resultReceiver != null) {
                    resultReceiver.send(-1, null);
                }
            }
        }
    }
}

我的问题是,我确定resultReceiver仍然存在,如果网络操作超过10秒,它会做它必须做的事情吗?

1 个答案:

答案 0 :(得分:0)

以下是SDK中的relevant documentation

  

如果此BroadcastReceiver是通过标签启动的话   从此函数返回后,该对象不再存在。这个   表示您不应执行任何返回结果的操作   你是异步的 - 特别是与服务交互,   你应该使用startService(Intent)而不是bindService(Intent,   ServiceConnection,int)。如果您希望与服务进行交互   已经在运行,你可以使用peekService(Context,Intent)。

     

registerReceiver中使用的Intent过滤器(BroadcastReceiver,   IntentFilter)和应用程序清单不保证是   独家。它们是操作系统有关如何查找的提示   合适的接收者。发件人可以强制交付   特定收件人,绕过筛选器解析。为此原因,   onReceive()实现应该只响应已知的动作,   忽略他们可能收到的任何意外意图。

底线:

  1. 如果您启动了某项服务,请使用startService(Intent)
  2. 不要在onReceive上执行长时间运行的应用程序。
  3. AsyncTasks可能会被销毁,您最好的选择是使用服务。如果您在服务中使用AsyncTask,那应该没问题。