【问题标题】:onCreate() method is not working properly in Android MarshmallowonCreate() 方法在 Android Marshmallow 中无法正常工作
【发布时间】: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


【解决方案1】:

Android Marshmallow 运行良好。您遇到此问题是因为您没有正确遵守活动生命周期。

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

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

【讨论】:

  • @TsomoNe 您的编辑正是我已经告诉您的。我还告诉过你为什么 Marshmallow 的循环“不同”(事实上,它并没有什么不同)以及如何解决它。您是否尝试过我提出的解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 2019-06-02
  • 2021-12-29
  • 2014-09-29
  • 1970-01-01
相关资源
最近更新 更多