了解Android应用程序生命周期

时间:2016-06-23 01:37:41

标签: android android-lifecycle

之前我发布了this问题,结论是我需要更多调试才能了解应用的生命周期。这是跟进,我实际上更加困惑。

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

注意:我目前对背景执行不感兴趣。

修改:关闭应用时,Application.onCreate被称为 afer 主要活动的Activity.onDestroy。我不确定这是如何相关的,只会增加混乱。 其主要活动被销毁后,应用程序正在“创建”?没有意义。

编辑:这里留下示例日志。我第一次运行应用程序,然后通过点击“全部清除”关闭它。我相信这会让服务在后台运行。这个日志是我第二次运行应用程序。请注意,应用程序启动时不会调用onCreate,而是在关闭应用程序后调用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:colors = 0xff000000   06-22 19:54:29.981 2504-2504 / com.demo.demochatdemo I / PhoneWindow:   [setNavigationBarColor2] color = 0x ff000000 06-22 19:54:30.001   2504-2504 / com.demo.demochatdemo I / Activity:Activity.onPostResume()   叫06-22 19:54:30.011 2504-2504 / com.demo.demochatdemo   I / ViewRootImpl:CPU渲染VSync enable = true 06-22 19:54:30.011   2504-3647 / com.demo.demochatdemo D / OpenGLRenderer:使用   EGL_SWAP_BEHAVIOR_PRESERVED:true 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 QUALCOMM构建:(Iac7c2e2837)                                                                        OpenGL ES着色器编译器版本:E031.25.03.04                                                                        建造日期:2015年8月7日星期三                                                                        当地分行: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 / Timeline:   时间轴:Activity_idle id:android.os.BinderProxy@31f3e056   时间:150361131

此时我关闭应用程序并获取以下内容:

  

06-22 19:54:40.621 2504-2504 / com.demo.demochatdemo I / Activity:   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

<?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> 正在那里召唤。

编辑:这是清单:

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;
        }
    }));
}

编辑:这是活动的代码。

public class ContactActivity extends Activity实现了Store.Delegate {

{{1}}

}

1 个答案:

答案 0 :(得分:1)

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