【发布时间】:2016-02-04 11:03:21
【问题描述】:
[关闭]
我有一个名为 A 和 B 的两个活动。
ActivityA(Launcher)显示列表数据(RecyclerView),数据从WebService下载。
当我按下列表项时,ActivityB 会显示列表项详细信息。
问题是:
当我从 ActivityB 按下返回按钮时,ActivityA 的 onCreate() 方法工作并重新下载已下载的数据,例如重新启动应用程序。我不想重新下载或重新调用 onCreate() 方法。
我测试了两台具有预 Marshmallow 操作系统的设备:
- 三星 Galaxy S5(操作系统版本 4.4.4)
- Sony Xperia(操作系统版本 4.1.2)
结果是:
当我从 ActivityB 按下返回按钮时,ActivityA 不会重新下载。 ActivityA 已经显示了最后定位的列表。我想要这个在棉花糖里。
我的 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>
[EDITED] 我发现了
我把一些Log放到ActivityA Lifecycle中,结果是:
当我在 Xperia 上运行应用程序时。 (棉花糖测试前结果):
ActivityA状态日志为:
- onCreate
- onStart
- onResume
然后选择列表项并启动ActivityB
ActivityA状态日志为:
- 暂停
- onStop
然后我从 ActivityB 按返回按钮并导航回 A
ActivityA状态日志为:
- onRestart
- onStart
- onResume
当我在 Nexus 5 上运行应用程序时。(棉花糖测试结果):
ActivityA状态日志为:
- onCreate
- onStart
- onResume
然后选择列表项并启动ActivityB
ActivityA状态日志为:
- 暂停
- onStop
- onDestroy 这就是为什么在 Marshmallow 中调用此方法的原因
然后我从 ActivityB 按返回按钮并导航回 A
ActivityA状态日志为:
- onCreate onCreate() 被调用,导致 onDestory() 已经被调用,这就是问题
- onStart
- onResume
棉花糖的活动生命周期不同,为什么?这就是我遇到问题的原因。请帮助
【问题讨论】:
-
Activity A 是否声明了任何特殊的
launchMode或其他属性,例如noHistory? -
@Raghavendra:好的,我会尽快发布一些代码
-
@Raghavendra:已发布代码。
-
Marshmallow设备总是在没有特别许可的情况下杀死 Activity A 是不可信的。您能否检查该设备上的开发人员设置,看看是否选中了Don't Keep Activities选项。 ---其他可能的原因是打盹模式检查此链接以禁用它“androidpit.com/how-to-disable-doze-android-marshmallow”,尽管它仅在设备空闲或其他情况下才会激活..但也试试看;) -
@AnkitBansal:我检查了开发人员选项,不要启用活动。你救了我的命。谢谢你。我讨厌启用此选项的人:)
标签: android android-activity android-6.0-marshmallow oncreate start-activity