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

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

【问题讨论】:

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

标签: android android-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】:

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

当您准备好缓存/过渡到父级时,您可以在您的子级 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 开始加载和执行时继续执行。请参阅我的答案以获得解决方案。
      猜你喜欢
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多