我有一个 Android 服务,它使用单独的线程对图像进行一些后台处理。如果这个Service出现错误,或者线程出现更糟的情况,最好的做法是通知启动Activity这个问题,让应用程序恢复到稳定状态(即启动服务之前的状态)。
在服务中,我可以发布 Toast 或 Notification,但这对我没有帮助。我想将问题告知用户,但同时将应用程序恢复到稳定状态。
我有一个 Android 服务,它使用单独的线程对图像进行一些后台处理。如果这个Service出现错误,或者线程出现更糟的情况,最好的做法是通知启动Activity这个问题,让应用程序恢复到稳定状态(即启动服务之前的状态)。
在服务中,我可以发布 Toast 或 Notification,但这对我没有帮助。我想将问题告知用户,但同时将应用程序恢复到稳定状态。
如果有人搜索这个,我会解释我最终做了什么。
在服务内部,我添加了一个扩展AsyncTask的私有类。这就是所有处理完成。
在这个类中,我有一个私有变量“异常”。doInBackground方法的内容由 try/catch 包围,任何捕获的异常都存储在“异常”中。在onPostExecute方法中,我检查是否设置了“异常”,如果是这种情况,我会发送带有异常详细信息的广播PROCESSING_ERROR,以便通知调用活动。
如果您不知道AsyncTask、doInBackground或onPostExecute是什么,您应该阅读以下内容:
您可以使用 aMessenger
在服务和主应用程序之间传递信息。
在您的主要活动中定义一个信使,如下所示:
private Messenger = mMessengerCliente = new Messenger(new IncomingHandler());
/**
* Handler of incoming messages from service.
*/
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_1:
//actions to perform on message type 1
break;
case MSG_2:
//actions to perform on message type 2
break;
default:
super.handleMessage(msg);
}
}
}
将Messenger
对象作为Extra
或绑定到您的服务时传递。
在您的服务中,恢复Messenger
对象并使用它进行通信:
mMsgClientMain = (Messenger)intent.getExtras().get(EXTRA_MESSENGER);
Message msg = Message.obtain(null, MSG_1, arg1, arg2);
msg.replyTo=reply_to; // if you need to have bidirectional communication, pass here the service messenger object
mMsgClientMain.send(msg);
问候。