应用程序错误地以非启动器活动开始

时间:2017-10-21 12:09:34

标签: android activity-lifecycle

我正在开发一款Android应用,其中包含MainActivity(启动器活动),其他一些activities,一些intent services以及用于存储应用的自定义应用类全数据。

应用启动程序为:

  1. 启动器 activity MainActivity 启动

  2. 如果自定义应用程序data中的class未初始化,MainActivity将根据持久存储的数据以及用户是否已登录来初始化自定义Application类中的数据(我使用Firebase进行身份验证)

  3. MainActivitylog

  4. 中打印一些内容
  5. MainActivity启动其中一个activities并致电finish()以终止自身。

  6. 我遇到了以下问题:

    1. 通过USB连接我的设备后,我从Android Studio启动了应用程序并在"其他"之间导航。 activities,一切正常。

    2. 我将设备与USB断开连接,并使用设备上的其他应用程序约一个小时。应用最后显示的activityGameListActivity

    3. 我通过点击设备屏幕上的图标启动了我的应用。该应用程序在starup期间崩溃。

    4. 我将设备连接到USB并检索了一些logs

    5. 在日志中我可以看到崩溃发生是因为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>
      

1 个答案:

答案 0 :(得分:0)

我对发射器活动的理解是错误的。即使所有组件都已被破坏且android已经杀死了应用程序进程,也不能假定应用程序的下一次启动将通过启动程序(我的MainActivity)活动完成。 Android可以在上一个会话中的最后一个活动中恢复该应用程序。

我想这意味着我需要检查初始化序列是否需要在OnCreate()的所有活动中运行,如果是,请启动MainActivity(将处理初始化)并完成活动正在开始。

在这里找到答案:http://www.developerphil.com/dont-store-data-in-the-application-object/

感谢您的回答