【问题标题】:Understanding Android Application lifecycle了解 Android 应用程序生命周期
【发布时间】:2016-06-23 01:37:41
【问题描述】:

我之前发布过this 问题,结论是我需要更多调试才能了解应用程序的生命周期。下面是后续,其实我更困惑。

我的Application.onCreate 方法被调用了两次:一次是在应用程序启动时,一次是在我关闭它时。这应该发生吗?问题是,我有一个服务,我想在应用程序启动时启动并在应用程序终止时停止。显然onCreate 在这两种情况下都被调用了?请指教。

注意:我目前对后台执行不感兴趣。

编辑:当关闭应用程序时,Application.onCreate 被称为 afer 主要活动的Activity.onDestroy。我不确定这有什么关系,只会增加混乱。应用程序正在“创建” 其主要活动被破坏?没有意义。

编辑:在这里留下一个示例日志。我第一次运行该应用程序,然后通过点击“全部清除”将其关闭。我相信这将使服务在后台运行。该日志是我第二次运行该应用程序。请注意,onCreate 在应用启动时不会被调用,而是在我关闭它后被调用:

06-22 19:54:29.971 2504-2504/com.demo.demochatdemo I/PhoneWindow: [generateLayout] setColorNavigationBar => color=0x ff000001 06-22 19:54:29.981 2504-2504/com.demo.demochatdemo D/PhoneWindowEx: [PWEx][generateLayout] setNavigationBarColor2 : 颜色=0xff000000 06-22 19:54:29.981 2504-2504/com.demo.demochatdemo I/PhoneWindow: [setNavigationBarColor2] 颜色=0x ff000000 06-22 19:54:30.001 2504-2504/com.demo.demochatdemo I/活动:Activity.onPostResume() 致电 06-22 19:54:30.011 2504-2504/com.demo.demochatdemo I/ViewRootImpl:CPU 渲染 VSync 启用 = true 06-22 19:54:30.011 2504-3647/com.demo.demochatdemo D/OpenGLRenderer:使用 EGL_SWAP_BEHAVIOR_PRESERVED:真 06-22 19:54:30.021 2504-2504/com.demo.demochatdemo D/Atlas:验证地图... 06-22 19:54:30.051 2504-3647/com.demo.demochatdemo I/Adreno-EGL: : EGL 1.4 高通构建: (Iac7c2e2837) OpenGL ES 着色器编译器版本:E031.25.03.04 建造日期:2015 年 7 月 8 日星期三 本地分公司:LA_BR_1_2_3_RB1_AU080_1285665 远程分支: 本地补丁: 重构分支:06-22 19:54:30.051 2504-3647/com.demo.demochatdemo I/OpenGLRenderer:初始化 EGL, 版本 1.4 06-22 19:54:30.061 2504-3647/com.demo.demochatdemo D/OpenGLRenderer:启用调试模式 0 06-22 19:54:30.161 2504-2504/com.demo.demochatdemo V/ViewRootImpl:内容绘图 完成:com.demo.demochatdemo/com.demo.demochatdemo.ContactActivity 06-22 19:54:30.171 2504-2504/com.demo.demochatdemo W/IInputConnectionWrapper:非活动 InputConnection 上的 showStatusIcon 06-22 19:54:30.171 2504-2504/com.demo.demochatdemo I/时间线: 时间线:Activity_idle id:android.os.BinderProxy@31f3e056 时间:150361131

此时我关闭应用程序并获得以下信息:

06-22 19:54:40.621 2504-2504/com.demo.demochatdemo I/活动: Activity.onPostResume() 调用 06-22 19:54:40.641 2504-2504/com.demo.demochatdemo I/时间线:时间线:Activity_idle id:android.os.BinderProxy@31f3e056 时间:150371603 06-22 19:54:46.861 4061-4061/com.demo.demochatdemo I/com.demo.demochatdemo.ContactActivity: onCreate

onCreate 正在那里被调用。

编辑:这是清单:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.demo.demochatdemo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:name="com.demo.demochatdemo.ChatApplication">

        <activity
            android:name=".ContactActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".ChatActivity">
        </activity>

    </application>

</manifest>

编辑:这是活动的代码。

公共类 ContactActivity 扩展 Activity 实现 Store.Delegate {

private static final String TAG = ContactActivity.class.getName();
private String displayName;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    ListView listView;

    final ChatApplication chatApplication = (ChatApplication)getApplication();
    final ContactActivity contactActivity = this;

    setContentView(R.layout.contact_view);

    listView = (ListView) findViewById(R.id.contact_view);
    listView.setAdapter(new ContactViewAdapter(this, chatApplication.getStores(), new View.OnTouchListener() {

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            if (MotionEvent.ACTION_UP == motionEvent.getAction()) {

                Intent intent = new Intent(ContactActivity.this, ChatActivity.class);

                TextView displayName = (TextView) view.findViewById(R.id.display_name);
                CharSequence charSequence = displayName.getText();

                setDisplayName(charSequence.toString());

                intent.putExtra(ChatActivity.INTENT_EXTRA_STORE, charSequence);

                startActivity(intent);
            }

            return true;
        }
    }));
}

}

【问题讨论】:

  • 也许其他东西正在创建应用程序的新实例,我建议您生成带有更多信息的日志/跟踪以确认这一点
  • @meda 已更新,请修改!
  • @AndréFratelli 你能附上你的清单文件吗?
  • @ShobhitPuri 清单已添加。我觉得这一切都很奇怪,因为该应用真的很简单。
  • 这应该对你有帮助 - stackoverflow.com/questions/22079232/…

标签: android android-lifecycle


【解决方案1】:

您是否在关闭应用程序之前停止服务? Service.onStartCommand() 的默认实现返回 START_STICKY。如果您不覆盖它,我相信该服务将被重新启动,这会隐式地强制启动一个应用程序实例。

【讨论】:

  • 你可能是对的!我没有停止服务,因为我没有实施任何机制来跟踪应用程序何时关闭。现在我使用ActivityLifecycleCallbacks 和一个标志来跟踪是否启用了任何活动。我还没有进行很多测试,但还没有再次注意到这个问题。这很有意义。我会尝试覆盖 onStartCommand 并让你知道。
猜你喜欢
  • 2020-12-27
  • 1970-01-01
  • 2011-06-02
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多