保存意图

Save intent Extras

我有 3 个活动

第一个 activity 调用第二个 activity,第二个 activity 调用第三个 activity。

第二个 activity 使用第一个 activity 中的附加意图。

因此,当我从第 3 个 activity return(使用操作栏后退按钮)到第 2 个 activity 时,我在提取额外意图的地方得到了一个 nullpointerexception。注意:如果我按下导航栏后退按钮,则不会发生这种情况。

按下操作栏后退按钮时,它正在重新启动 activity,因此没有意图。

在按下导航栏后退按钮时,它正在恢复片段,因此我能够显示我的可分析数据。

关于如何保存 intent extras 的任何线索? 我认为一种解决方法是将其保存为共享首选项,但我想知道执行此操作的最佳做​​法。

编辑:添加代码

来自activity 1.

的片段
Intent intent = new Intent(getActivity(), TopTenTracksActivity.class)
                        .putExtra(Intent.EXTRA_TEXT, new String[]{artistId, artistName});
                startActivity(intent);

在 activity 2

的片段中获取意图
String[] artistInfo = getActivity().getIntent().getExtras().getStringArray(Intent.EXTRA_TEXT);

得到上面的空指针错误

错误日志

 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] android.os.Bundle.getStringArray(java.lang.String)' on a null object reference
        at com.plusgaurav.spotifystreamer.TopTenTracksActivityFragment.onCreateView(TopTenTracksActivityFragment.java:62)

编辑: 这是我的以下代码:

public class TopTenTracksActivity extends AppCompatActivity {

public static String[] artistInfo;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {

        artistInfo = savedInstanceState.getStringArray("savedArtistInfo");

    } else {

        // get intent info
        artistInfo = getIntent().getExtras().getStringArray(Intent.EXTRA_TEXT);

    }

    setContentView(R.layout.activity_top_ten_tracks);

    // set subtitle in the actionbar
    android.support.v7.app.ActionBar actionBar = getSupportActionBar();
    assert actionBar != null;
    actionBar.setSubtitle(artistInfo[1]);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // save intent
    outState.putStringArray("savedArtistInfo", artistInfo);
}

还是进入上面说的else循环。我的问题是为什么当我按下 ActionBar 时 savedInstanceState 为空。

ActionBar 背面实际上是 "Up" 按钮。它和设备后退按钮之间的区别在于 "Up" 按钮意味着在屏幕层次结构中上升(返回到父 activity 的实例),而设备后退按钮意味着去按时间顺序返回(字面意思是返回堆栈上的下一个 activity)。

根据您启动 activity 的方式和您为 activity 指定的启动模式,当您点击 "Up" 按钮时,您可能会被引导至该项目的新实例父 activity 而不是现有实例。

详情请阅读以下内容:http://developer.android.com/training/implementing-navigation/ancestral.html#NavigateUp

我的猜测是发生了什么(从我链接的页面):

If the parent activity has launch mode <standard>, and the up intent does not contain FLAG_ACTIVITY_CLEAR_TOP, the parent activity is popped off the stack, and a new instance of that activity is created on top of the stack to receive the intent.

尝试将您的 activity 2(或任何您似乎失去额外功能的 activity)的启动模式设置为 singleTop