我正在开发一款Android应用,其中包含MainActivity
(启动器活动),其他一些activities
,一些intent services
以及用于存储应用的自定义应用类全数据。
应用启动程序为:
启动器 activity MainActivity
启动
如果自定义应用程序data
中的class
未初始化,MainActivity
将根据持久存储的数据以及用户是否已登录来初始化自定义Application类中的数据(我使用Firebase进行身份验证)
MainActivity
在log
MainActivity
启动其中一个activities
并致电finish()
以终止自身。
我遇到了以下问题:
通过USB连接我的设备后,我从Android Studio启动了应用程序并在"其他"之间导航。 activities
,一切正常。
我将设备与USB断开连接,并使用设备上的其他应用程序约一个小时。应用最后显示的activity
为GameListActivity
我通过点击设备屏幕上的图标启动了我的应用。该应用程序在starup期间崩溃。
我将设备连接到USB并检索了一些logs
。
在日志中我可以看到崩溃发生是因为GameListActivity
访问了自定义Application class
中未初始化的对象。日志中的以下几行似乎很有趣:
10-15 21:13:42.515 1410-2915/? I/ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.xxx.game3/.MainActivity bnds=[282,812][540,1110]} from uid 10107 on display 0
10-15 21:13:42.584 1410-2907/? I/ActivityManager: Start proc 20722:com.xxx.game3/u0a313 for activity com.xxx.game3/.GameListActivity
似乎MainActivity
已启动,并在GameListActivity
启动后立即启动。但是上面3中描述的日志打印输出不存在,并且MainActivity
无法在没有首先执行日志打印输出的情况下启动GameListActivity
。 (我假设日志完全可靠)
此外,在我上面的7中第二次启动应用程序之前的某个时间,已记录:
10-15 21:03:13.163 1410-26164/? I/ActivityManager: Process com.xxx.game3 (pid 30877) has died
这是否表示错误或是否意味着Android已杀死我的应用程序以释放系统资源?
我可以先从Android Studio启动应用程序,然后单击设备上的图标,这会让事情搞糟吗?
可能是Android系统以某种方式启动GameListActivity
而不是MainActivity
?
编辑:在
下添加了Manifest
文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.game3">
<application
android:name=".GameApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
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=".GameListActivity"
android:label="@string/title_activity_game_list"
android:parentActivityName=".MainActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.xxx.game3.MainActivity"/>
</activity>
<service android:name=".NetworkService"/>
<service android:name=".FirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
<service android:name=".NotificationService"
android:enabled="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<activity android:name=".RegisterActivity">
</activity>
<receiver
android:name=".NetworkListener"
android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
<activity
android:name=".SignOutActivity"
android:label="@string/title_activity_sign_out"
android:theme="@style/AppTheme.NoActionBar">
</activity>
<activity
android:name=".NewGameActivity"
android:label="@string/title_activity_new_game"
android:parentActivityName=".GameListActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.xxx.game3.GameListActivity"/>
</activity>
<activity
android:name=".GameActivity"
android:label="@string/title_activity_game"
android:launchMode="singleTop"
android:parentActivityName=".GameListActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.xxx.game3.GameListActivity"/>
</activity>
<activity
android:name=".InvitePlayerActivity"
android:label="@string/title_activity_invite_player"
android:parentActivityName=".GameActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.xxx.game3.GameActivity"/>
</activity>
<activity
android:name=".HandleInviteActivity"
android:label="@string/title_activity_handle_invite"
android:parentActivityName=".GameListActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.xxx.game3.GameListActivity"/>
</activity>
</application>
</manifest>
答案 0 :(得分:0)
我对发射器活动的理解是错误的。即使所有组件都已被破坏且android已经杀死了应用程序进程,也不能假定应用程序的下一次启动将通过启动程序(我的MainActivity
)活动完成。 Android可以在上一个会话中的最后一个活动中恢复该应用程序。
我想这意味着我需要检查初始化序列是否需要在OnCreate()
的所有活动中运行,如果是,请启动MainActivity
(将处理初始化)并完成活动正在开始。
在这里找到答案:http://www.developerphil.com/dont-store-data-in-the-application-object/
感谢您的回答