将活动发送到后台而不完成

Posted

技术标签:

【中文标题】将活动发送到后台而不完成【英文标题】:Sending Activity to background without finishing 【发布时间】:2011-01-03 18:07:32 【问题描述】:

如何在不调用其finish() 方法的情况下使活动进入后台并返回启动此活动的父活动?我尝试了很多,但我找不到解决方案。因此,如果你们能提供帮助,我将非常感激。

【问题讨论】:

你想通过将 Activity 发送到后台来实现什么? 实际上我有需要缓存的数据。父活动第一次动态加载,然后将其发送给子活动。子活动修改数据,修改后的数据应该在那里。但如果它完成,以前的数据将发送到子活动 【参考方案1】:

如果 Activity 在与其父级不同的任务中运行,则以下内容将起作用。要实现这一点,请参阅http://developer.android.com/guide/topics/manifest/activity-element.html#lmode。

public void onBackPressed () 
    moveTaskToBack (true);

当前任务将被隐藏,但它的状态将保持不变,当它被重新激活时,它会像您离开时一样显示。

【讨论】:

绝对不能保证 Activity 的状态不会受到影响。很可能,该活动将被操作系统破坏。除非您响应生命周期事件并相应地保存/恢复状态,否则您的 Activity 将不知道它的创建和向后移动的事实。 Jonathan 是正确的,没有保证后台活动将继续运行。但在正常情况下,它们不会被操作系统破坏,直到经过一段时间。如果破坏会给您带来问题,那么您必须像其他评论者所说的那样保存并恢复状态。 所以 onSaveInstanceState() 将确保我的状态可以在之后恢复,对吧? 您应该在方法中添加@Override 以避免错误和预期行为。【参考方案2】:

如果您有想要在后台缓存/存储/处理的数据,可以使用AsyncTask 或Thread。

当您准备好缓存/过渡到父级时,您可以在您的子级 Activity 方法之一中执行类似以下操作(假设您使用 startActivityForResult() 启动子级)

线程方法:

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 进程进行通信的情况。

【讨论】:

【参考方案3】:

简单

受保护的 void minimizeApp() Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 开始活动(开始主);

【讨论】:

谢谢你,你救了我的命 :)【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

试试:

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

如果您使用这种方式,将调用 CurrentActivity 中的 onPause() 方法,并且如果您在 CurrentActivity 中有一个静态变量(如 MediaPlayer 对象),它将继续存在(如果正在播放,则继续播放)..

我在我的应用程序中使用它,但我找到了一种更好的方法来使用服务。

希望对您有所帮助!

【讨论】:

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

以上是关于将活动发送到后台而不完成的主要内容,如果未能解决你的问题,请参考以下文章

将数据从活动发送到另一个而不启动它

如何将意图发送到正在运行的服务或后台活动?

Python 将击键发送到非活动应用程序

将意图从服务发送到活动

无法在后台服务中将数据发送到Firebase

将App发送回最近的应用程序堆栈android