为什么我的BroadcastReceiver会在一段时间后停止接收

时间:2016-05-02 16:53:25

标签: android android-service android-broadcast android-broadcastreceiver

我有IntentService做了很长时间的工作,大约需要15分钟。这是从我的服务器获取新数据的同步过程。

当此服务启动时,我也会启动一个活动,以显示该进程。

此活动会创建一个BroadcastReceiver,拦截从服务发送的有关流程进度的消息。

如果我让应用程序完成这项工作,过了一会儿,SO会关闭屏幕。

当我再次打开屏幕时,大约15分钟后,服务已经完成,但进度似乎已过时。 BroadcastReceiver已停止工作,活动未收到我的END OF SYNCHRONIZATION消息。

问题是,在此消息中,我再次启动主要活动,让用户再次使用该应用程序。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

广播接收器不能用于长时间工作。

广播接收器的寿命大约持续10-15秒。

广播接收机的推荐或典型用途是

  • 启动服务
  • 显示祝酒
  • 开始活动

在您的情况下,您应该从广播接收器启动服务并完成该服务中的所有工作。

答案 1 :(得分:0)

我用http://developer.android.com/intl/pt-br/guide/components/services.html#Foreground解决了这个问题。

我的服务

public class MyService extends Service {

    public interface MyCallback {
        void onProgress(int progress);
    }

    public class MyBinder {
        public MyService getService() {
            return MyService.this;
        }
    }

    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    public void make(MyCallback callback) {

        Notification n = new Notification.Builder(this)
            .setContentTitle("Processing")
            .getNotification();

        startForeground(666 /*some ID*/, n);
        try {
            callback.onProgress(0);
            // do the hard sutff and report progress
            callback.onProgress(100); // report 100%
        } finally {
            stopForeground(true);
        }
    }
}

我的活动

public MyActivity extends Activity implements ServiceConnection, MyService.MyCallback {

    @Override
    protected onStart() {
        super.onStart();
        // 1 - bind service to this activity
        Intent i = new Intent(this, MyService.class);
        this.bindService(i, this, BIND_AUTO_CREATE);
    }

    @Override
    public void onServiceConnected(ComponentName componentName, final IBinder iBinder) {
        // 2 - when the service was binded, starts the process asynchronous
        new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... voids) {
                ((MyService.MyBinder) iBinder).getService().make(MyActivity.this);
                return null;
            }
        }.execute();
    }

    @Override
    public void onProgress(int progress) {
        // 3 - when to callback is fired, update the UI progress bar
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // call ProgressBar.setProgress(progress);
            }
        });
    }

}