onCreate()方法在Android Marshmallow中无法正常工作

时间:2016-02-04 11:03:22

标签: android android-activity android-6.0-marshmallow oncreate start-activity

[CLOSED]

我有一项名为A和B的两项活动。

ActivityA(Launcher)显示列表数据(RecyclerView),并从WebService下载数据。

当我按下列表项时,ActivityB显示列表项详细信息。

问题是:

当我按下ActivityB的后退按钮时,ActivityA的onCreate()方法工作并重新下载已下载的数据,如重新启动应用程序。我不想重新下载或重新调用onCreate()方法。

我测试了两个设备有前Marshmallow OS:

  • 三星Galaxy S5(操作系统版本4.4.4)
  • Sony Xperia(操作系统版本4.1.2)

结果是:

当我按下ActivityB的后退按钮时,ActivityA不会重新下载。 ActivityA已经显示了最后定位的列表。我希望在Marshmallow中使用它。

我的Marshmallow设备是Nexus 5(操作系统版本6.0.1)

我该如何解决这个问题?

[以下某些代码]

// This is ActivityA
public class MainView extends AppCompatActivity {

...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_view);

    ...

    if (NetworkChecker.isNetAvailable(context)) {
        mDataSet = update(); // this method calling WebService
    } else {
        mDataSet = Database.getDatas(); // this method reading datas from sqlite.
    }
    createListView(mDataSet);

    ...
}

private void createListView(List<NamecardEntity> mDataSet) {
    mRecyclerView = (RecyclerView) findViewById(R.id.itemsRecyclerView);
    mRecyclerView.setHasFixedSize(true);
    RecyclerView.ItemDecoration itemDecoration =
            new DividerItemDecorator(getContext(), LinearLayoutManager.VERTICAL);
    mRecyclerView.addItemDecoration(itemDecoration);

    LinearLayoutManager mLayoutManager = new LinearLayoutManager(getContext());
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new ListAdapter(getActivity(), getActivity().getApplicationContext(), mDataSet);
    mRecyclerView.setAdapter(mAdapter);
    mRecyclerView.addOnScrollListener(onScrollListener);
}

...
}

public class ListAdapter extends RecyclerSwipeAdapter<ListAdapter.SimpleViewHolder> {

...

@Override
public void onBindViewHolder(final SimpleViewHolder viewHolder, final int position) {
    Entity item = mDataset.get(position);

    ...

    viewHolder.front.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            activity.startActivity(new Intent(mContext, DetailView.class));
        }
    });

    ...
}

}

// This is ActivityB
public class DetailView extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.detail_view);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setTitle("");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

    ...
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_activity_filter, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            finish();
            return true;
        case R.id.action_filter:
            // TODO filter
            return true;
    }
    return true;
}
}

// In Manifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">

<activity
    android:name=".MainView"
    android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".DetailView"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme.NoActionBar" />
</application>

[已编辑]我发现了

我将一些Log放入ActivityA生命周期,结果是:

当我在Xperia上运行应用程序时。 (棉花糖前测试结果):

ActivityA状态日志是:

  • 的onCreate
  • 在onStart
  • 的onResume

然后选择列表项并启动ActivityB

ActivityA状态日志是:

  • 的onPause
  • 的onStop

然后我按下ActivityB的后退按钮并导航回A

ActivityA状态日志是:

  • onRestart
  • 在onStart
  • 的onResume

当我在Nexus 5上运行应用程序时(Marshmallow测试结果):

ActivityA状态日志是:

  • 的onCreate
  • 在onStart
  • 的onResume

然后选择列表项并启动ActivityB

ActivityA状态日志是:

  • 的onPause
  • 的onStop
  • onDestroy&lt; - 这就是为什么这个方法在Marshmallow中调用的原因

然后我按下ActivityB的后退按钮并导航回A

ActivityA状态日志是:

  • onCreate&lt; - onCreate()调用,导致onDestory()已经调用,这就是问题
  • 在onStart
  • 的onResume

ACSHITY LIFECYCLE在MARSHMALLOW中的作用不同,为什么?这就是我遇到问题的原因。 PLS帮助

1 个答案:

答案 0 :(得分:0)

Android Marshmallow工作正常。您遇到此问题是因为您没有正确遵守活动生命周期。

enter image description here

请注意,由Android决定是否销毁Activity。你必须考虑到这一点。事实证明,在以前的Android版本中,您的Activity已被销毁,因此当您导航回来时,它会通过onCreate()。现在它不会破坏它,所以它不会通过onCreate()

刷新数据的正确方法是始终onResume()方法上执行此操作,以确保无论Android是否销毁Activity都会调用它。