保存意图额外

时间:2015-06-06 23:04:28

标签: android android-intent android-activity activity-lifecycle

我有3项活动

第一个活动调用第二个活动,第二个活动调用第三个活动。

第二个活动使用第一个活动的意图附加内容。

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

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

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

有关如何保存意图附加物的任何线索? 我认为一种解决方法是将其保存为共享偏好,但我想知道这样做的最佳实践。

编辑:添加代码

来自活动1的片段。

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

获取活动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为null。

1 个答案:

答案 0 :(得分:3)

ActionBar后退实际上是“向上”按钮。它与设备后退按钮的区别在于,“向上”按钮意味着在屏幕层次结构中上升(返回到父活动的实例),而设备后退按钮则按时间顺序返回(字面意思是下一个)背堆上的活动。)

根据您开始活动的方式以及您为该活动指定的启动模式,当您点击“向上”按钮时,您可能会被定向到该父活动的新实例而不是现有实例。

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

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

  

如果父活动具有启动模式< standard>,并且up intent不包含FLAG_ACTIVITY_CLEAR_TOP,则从堆栈弹出父活动,并在堆栈顶部创建该活动的新实例以接收意图。

尝试将您的活动2的启动模式(或您似乎正在失去额外费用的任何活动)设置为singleTop