之前我发布了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}}
}
答案 0 :(得分:1)
在关闭应用程序之前,您是否停止服务? Service.onStartCommand()的默认实现返回START_STICKY。如果你没有覆盖它,我相信服务将重新启动,这会隐式强制启动一个Application实例。