将Activity发送到后台而不结束

19

如何让一个活动进入后台而不调用其finish()方法,并返回启动它的父活动?我尝试了很多次,但是无法找到解决方案。如果你们能帮忙,我将非常感激。


2
你试图通过将Activity置于后台来实现什么目的? - David Webb
实际上,我有需要缓存的数据。父活动首次动态加载它,然后将其发送到其子活动。子活动修改数据,修改后的数据应该存在。但是,如果它完成了,先前的数据将被发送到子活动。 - 1HaKr
5个回答

50

4
不能保证Activity的状态不会受到影响。很可能,操作系统会销毁该Activity。除非您响应生命周期事件并相应地保存/恢复状态,否则该Activity将无法识别其已创建并被移动到后台的事实。 - Jonathan
2
Jonathan是正确的,没有_保证_后台活动将会继续运行。但在正常情况下,它们通常不会被操作系统销毁,直到一定时间过去。如果销毁对您造成问题,那么您必须像其他评论者所说的那样保存和恢复状态。 - mhsmith
那么 onSaveInstanceState() 会确保我的状态可以在之后被恢复,对吗? - JohnyTex
你应该在方法上添加@Override以避免出现错误和预期行为。 - mathematics-and-caffeine

2

简单地说

protected void minimizeApp() {
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

谢谢,你救了我的命 :) - Mạnh Hùng

2
如果您有想要在后台缓存/存储/处理的数据,可以使用AsyncTaskThread
当您准备好缓存/转换到父级时,在您的子Activity方法中执行以下操作(假设您使用startActivityForResult()启动了子Activity)。
线程方法:
Thread t1 = new Thread(new Runnable() {

        @Override
        public void run() {
            // PUT YOUR CACHING CODE HERE

        }
});

t1.start();

setResult( whatever );
finish();

你可以使用Handler,如果你需要从你的新线程中回传任何信息。 AsyncTask方法:
new CacheDataTask().execute( data params );
set_result( whatever );
finish();

AsyncTask用于需要在新线程中处理某些内容,但仍需与UI进程进行通信的情况。


0

尝试:

 Intent toNextActivity = new Intent(CurrentActivity.this,
                                     NextActivity.class);
 CurrentActivity.startActivity(toNextActivity);

如果您使用这种方式,将会调用CurrentActivity的onPause()方法。如果您在CurrentActivity中有一个静态变量(例如MediaPlayer对象),它将继续存在(或者如果正在播放,则继续播放)。
我在我的应用程序中使用了这种方式,但是我发现使用服务有更好的方法来实现。
希望这能帮到您!

我想要的是返回启动这个活动的父活动,而不是到某个新的活动。 - 1HaKr
使用Intent转换到新活动只会运行正常的生命周期活动,例如onPause()onStop()。不会发生的是在新的Activity开始加载和执行时,进程继续执行。请参见我的答案以获取解决方案。 - stormin986

0

将任务向后移动并不会确保您保留任何状态,除非您通过响应Activity生命周期事件手动执行。

您应该只需使用startActivity()通过Intent启动第二个Activity,或者如果您需要从第二个Activity返回结果,则使用startActivityForResult()。这允许您在用户完成Activity并返回到您的第一个Activity时接收回调。

启动Activity并获取结果:http://developer.android.com/reference/android/app/Activity.html#StartingActivities


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接