Android 恢复活动时获取服务的结果
我有一个活动正在使用片段进行布局。当用户单击“我正在通过internet发送文件”按钮时,这对Async来说太重了,它会使我的应用程序崩溃,因为我需要在对话框执行完毕后关闭它。服务能做到这一点吗?我需要使用该服务来处理文件,并发送一条消息告诉我的活动已经完成,或者如果用户的手机睡着了,或者他们按了他们的主页按钮,我需要在进入“活动恢复”时了解服务是否完成。这可能吗?创建一个私有类,然后在Android 恢复活动时获取服务的结果,android,android-asynctask,android-service,android-dialogfragment,Android,Android Asynctask,Android Service,Android Dialogfragment,我有一个活动正在使用片段进行布局。当用户单击“我正在通过internet发送文件”按钮时,这对Async来说太重了,它会使我的应用程序崩溃,因为我需要在对话框执行完毕后关闭它。服务能做到这一点吗?我需要使用该服务来处理文件,并发送一条消息告诉我的活动已经完成,或者如果用户的手机睡着了,或者他们按了他们的主页按钮,我需要在进入“活动恢复”时了解服务是否完成。这可能吗?创建一个私有类,然后在OnClick函数中执行以下操作: new SendPictoServerextends().execute(
OnClick
函数中执行以下操作:
new SendPictoServerextends().execute();
SendPictoServer扩展:
private class SendPictoServerextends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
try {
//code to send data to the server
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(e);
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Dismiss the progress dialog
if (pDialog.isShowing())
pDialog.dismiss();
System.out.println("Mission is done " );
}
}
私有类SendPictoServer扩展异步任务{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=newprogressdialog(getActivity());
setMessage(“请稍候…”);
pDialog.setCancelable(假);
pDialog.show();
}
@凌驾
受保护的Void doInBackground(Void…arg0){
试一试{
//将数据发送到服务器的代码
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
系统输出打印ln(e);
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果){
super.onPostExecute(结果);
//关闭进度对话框
if(pDialog.isShowing())
pDialog.disclose();
System.out.println(“任务完成”);
}
}
服务部门可以处理这一问题,这是正确的。您需要一个活页夹或广播接收器来与您的活动进行通信。在我看来,这可能有点复杂,因为您需要一种方法来缓存结果,直到您的活动从后台返回/重新创建
您可以查看哪一个库是专为使用服务帮助解决此问题而设计的
Android服务的另一个解决方案是创建自己的管理器来处理这个问题。管理器与活动生命周期是分开的,可能应该是一个单例(尽管它不一定必须是单例),它可以在后台线程中处理并存储结果。在您的片段中,onResume
作为侦听器向您的经理注册,以便在操作完成时接收结果。在onPause
中注销片段以避免上下文泄漏。因为管理器存储结果,所以它可以保留结果,直到片段恢复,然后交付它
滚动您自己的“Manager”类型的类对您来说是额外的努力,但如果您不想出于任何原因广泛使用第三方库,那么这可能是值得的。不幸的是,这对我不起作用,因为它与我现在所做的类似。无法保证当我进入onPostExecute时,该活动将处于活动状态,因此当用户执行诸如点击“主页”或让手机进入睡眠等操作时,会抛出非法SateException(正如我在测试此应用程序时多次看到的那样)。我绝对需要对话框来显示每次异步完成的时间。ProgressDialog会将我的活动发送到后台并调用它的onPause,导致上述异常;用户在发送进度对话框的数据时,即使“后退”按钮不起作用,也无法执行任何操作?如果它是可取消的,则可以从中取出。这仍然不能解决用户点击主页按钮的问题。但即便如此,进度对话框本身也会将活动置于后台,因此不能保证在点击onPostExecute后会调用onSaveInstance。当这种情况发生时,我提到的异常将被抛出;现在我明白你想说什么了。。。选中此项@emdal这是一个很好的起点,但请注意链接中的代码将服务绑定到活动。因此,如果活动被破坏,服务将停止。这不是OP想要的。您可以使用广播接收器,在获得数据后将数据投入服务并发送广播。在activity register broadcast的
onResume
和onPause
方法中取消注册,如果在我的活动暂停时我的服务中的处理结束,会发生什么情况?当我的活动调用onResume并注册广播时,是否会有某种队列,我可以从中获得结果?我只需要知道数据是发送的,这样我就可以关闭片段对话框。是否有一种方法可以让服务运行,即使活动暂停,然后让我的活动查看服务,看看在我调用onResume时它是否完成,或者它是否比这更复杂?我相信它比这更复杂一些。该服务实际上只应运行到其任务完成为止。但是,您可以创建长时间运行的服务,您只需注意服务生命周期以及活动生命周期。为了保证服务持续运行,您可以使用前台服务
,但这需要您在状态栏中放置一个通知,而这可能不是您想要的。