从另一个活动重新创建/重新启动活动

Posted

技术标签:

【中文标题】从另一个活动重新创建/重新启动活动【英文标题】:recreate /restart activity from another activity 【发布时间】:2015-11-25 04:55:44 【问题描述】:

我看过这个Question,但没有得到好的答案,我的情况有点不同。我有 2 个活动 A 和 B。从活动 AI 启动活动 B 但活动 A 必须保持打开状态,现在在我登录活动 BI 后将一些数据保存在共享首选项中,我需要活动 A 中的布局根据共享首选项值进行更改,因此登录后必须重新创建 Activity A 以应用更改,但仍应位于 Activity B 之后。

所以我的问题是可以从活动 B 重新创建活动 A 吗?

【问题讨论】:

为什么需要重新创建活动 A?为什么不在登录后从活动 B 向活动 A 发送一条消息,告诉活动 A 更新自身。有几种方法可以这样做,但在这种情况下,IMO 最自然的方法是使用 developer.android.com/reference/android/app/…, int) 从活动 A 开始活动 B 【参考方案1】:

我不知道您对“活动 A 必须保持打开”的确切含义,因此您必须弄清楚该部分或提供更详细的解释。你的意思是活动 B 覆盖活动 A 吗?我会假设的。

我建议你在 Activity A 中使用 3 个片段。 一个片段用于初始布局,另一个片段用于新布局。 然后是另一个 Fragment,而不是 Activity B,我称之为 FragmentB。

FragmentB中创建一个回调内部接口。

public interface Callbacks 
    void onLoggedIn();

然后让Activity A实现这个回调

public class ActivityA extends Activity implements FragmentB.Callbacks 

//rest of the activity...

 @Override
    public void onLoggedIn() 

getFragmentManager().beginTransaction()
                            .replace(R.id.container, new SecondFragment())
                            .commit();


显然,您可以为ActivityAFragmentBCallbacksonLOggedInSecondFragment 选择任何您喜欢的名称。 其中SecondFragmentFragmentB登录后包含布局的fragment的名称。

【讨论】:

【参考方案2】:

http://developer.android.com/reference/android/app/Activity.html#StartingActivities

您应该使用startActivityForResult 并在onActivityResult 上更新您的活动,而不是**重新创建*您的活动

例如

 public class MyActivity extends Activity 
     ...

     static final int PICK_CONTACT_REQUEST = 0;

     public boolean onKeyDown(int keyCode, KeyEvent event) 
         if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) 
             // When the user center presses, let them pick a contact.
             startActivityForResult(
                 new Intent(Intent.ACTION_PICK,
                 new Uri("content://contacts")),
                 PICK_CONTACT_REQUEST);
            return true;
         
         return false;
     

     protected void onActivityResult(int requestCode, int resultCode,
             Intent data) 
         if (requestCode == PICK_CONTACT_REQUEST) 
             if (resultCode == RESULT_OK) 
                 // A contact was picked.  Here we will just display it
                 // to the user.
                 startActivity(new Intent(Intent.ACTION_VIEW, data));
             
         
     
 

【讨论】:

【参考方案3】:

您的解决方案是从共享首选项中获取值并更新到活动的 OnResume() 方法中的布局,例如 oncreate() 等:

@Override
public void onResume()
    super.onResume();
    // put your code here... to get sharedpreferences


【讨论】:

以上是关于从另一个活动重新创建/重新启动活动的主要内容,如果未能解决你的问题,请参考以下文章

从通知启动时防止重新创建活动活动

从通知意图启动活动时重新创建 Android ViewModel

Android:当应用程序被销毁和重新创建时总是启动启动活动

如何修复在 Android 中崩溃的活动的重新启动?

当应用程序重新启动并最小化时启动新活动

当活动从后台(暂停)到前台时重新创建 Android 活动