首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误的活动有时会启动。

错误的活动有时会启动。
EN

Stack Overflow用户
提问于 2011-07-13 01:58:33
回答 2查看 3.5K关注 0票数 5

我有一个Android应用程序,有很多活动。有时,错误的活动正在开始。

通常,应用程序子类启动,然后启动活动(StartAct.android:name="android.intent.category.LAUNCHER")做了一些工作,然后启动InitializeActivity.这做了一些工作,然后启动了我的主显示活动(MainAct)。前两个活动进行一些必要的初始化,包括在启动MainAct的意图之前设置一个静态MainAct标志。

活动是使用startActivity()使用特定意图(指定的...activity.class)启动的,并在startActivity()之后调用finish()。

然而,有时会发生这样的事情,我不知道为什么.

简而言之,当点击图标启动应用程序时,它会直接跳转到第三个活动(MainAct)。这将导致应用程序检测错误(isInitialized标志为false)并停止:

Icon:

  • ...Application子类启动时,
  • 通常会启动应用程序,还会触发一些工作人员运行threads
  • ...StartActivity,然后启动InitializeActivity和finishes
  • ...InitializeActivity运行,然后设置isInitialized并启动MainAct和finishes
  • ...MainAct启动。运行okay
  • ...Home按钮,“愤怒的小鸟”是

logs onPause,然后是onStop。应用程序子类拥有的

  • ...Worker线程继续定期进行操作和日志记录。
  • 在25分钟后,整个应用程序突然被关闭。这个观察基于日志活动的结束,app
  • Application
  • Time被
  • Home按钮点击
  • Launcher图标,按下

子类onCreate是调用的,而returns

  • *MainAct.onCreate是被调用的!(没有InitializeActivity__)*

,没有StartAct__

我遗漏了什么?

注意:由于这个问题,添加了初始化标志。它是在启动主活动的代码中的唯一位置设置的,在主活动中只在onCreate中进行检查。

每个请求清单文件(稍加修改)。请注意,此处的服务目前未使用。

代码语言:javascript
复制
<manifest
  xmlns:android="http://schemas.android.com/apk/res/android"
  package="xxx.yyy.zzz"
  android:versionCode="1" android:versionName="1.0.1">
  <application
    android:icon="@drawable/icon_nondistr"
    android:label="@string/app_name"
    android:name=".app.MainApp"
    android:debuggable="true">
    <activity
      android:label="@string/app_name"
      android:name=".app.StartAct" android:theme="@android:style/Theme.NoTitleBar">
      <intent-filter>
        <action
          android:name="android.intent.action.MAIN" />
        <category
          android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity
      android:label="Html"
      android:name=".app.HtmlDisplayAct"/>
    <activity
      android:label="Init"
      android:configChanges="orientation"
      android:name=".app.InitializeActivity" android:theme="@android:style/Theme.NoTitleBar"/>
    <activity
      android:label="MyPrefs"
      android:name=".app.PrefsAct" />
    <activity
      android:label="@string/app_name"
      android:theme="@android:style/Theme.NoTitleBar"
      android:name=".app.MainAct">
    </activity>
    <service
      android:name=".app.svcs.DataGetterService" />
  </application>
  <uses-sdk android:minSdkVersion="4"/>
  <uses-permission
    android:name="android.permission.INTERNET" />
  <uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission
    android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission
    android:name="com.android.vending.CHECK_LICENSE" />
  <uses-feature
    android:name="android.hardware.location.network"
    android:required="false" />
</manifest>
EN

Stack Overflow用户

发布于 2017-04-30 07:10:23

这确实是一个“让伤害雪上加霜”的例子--首先Android杀死了我最棒的应用程序,然后当用户重新启动我的应用程序时,Android试图通过启动错误的活动来“有所帮助”,从而导致我的应用程序崩溃。叹一口气。

这里是我非常疯狂的解决办法,以抵消Android的帮助。我的应用程序要求StartActivity必须是第一个活动,因此对于所有其他活动,我在onCreate()方法中添加一行。例如:

代码语言:javascript
复制
public class HelpActivity extends AppCompatActivity {

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      if (StaticMethods.switchToStartActivityIfNecessary(this))  return;  // <- this is the magic line

      ...

   }

  ...

}

为了完成这项工作,我在应用程序类中添加了一个开关变量:

代码语言:javascript
复制
public class OutBackClientApplication extends Application {

   ...

   // Switch to indicate if StartActivity has been started.
   // Values: -1 = StartActity has never been started or this is first invocation.
   //         0 = normal situation, StartActivity has been run at least once.
   private int _startActivityStatus = -1;

   public int getStartActivityStatus() { return _startActivityStatus; }

   public void setStartActivityStatus(int startActivityStatus) {
      _startActivityStatus = startActivityStatus;
   }

   ...

}

我有一个名为StaticMethods的类,它包括以下方法:

代码语言:javascript
复制
public class StaticMethods {

   /**
    * Method to test for the problematic situation where Android has previously killed this app, and
    * then when the user restarts the app Android tries to be helpful by restarting the activity
    * that was in the foreground when it killed the app, instead of starting the activity specified
    * in the manifest as the launch activity. See here:
    * http://stackoverflow.com/questions/6673271/android-wrong-activity-sometimes-starts
    *
    * The following line should be added to the onCreate() method of every Activity, except for
    * StartActivity, of course:
    *
    *    if (StaticMethods.switchToStartActivityIfNecessary(this))  return;
    */
   public static boolean switchToStartActivityIfNecessary(Activity currentActivity) {

      OutBackClientApplication outBackClientApplication =
                                        (OutBackClientApplication) currentActivity.getApplication();

      if (outBackClientApplication.getStartActivityStatus() == -1) {
         currentActivity.startActivity(new Intent(currentActivity, StartActivity.class));
         currentActivity.finish();
         return true;
      }
      return false;
   }

}

最后,当StartActivity启动时,需要重置开关:

代码语言:javascript
复制
 public class StartActivity extends AppCompatActivity {

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      ((OutBackClientApplication) getApplication()).setStartActivityStatus(0);

      ...

   }

   ...

}

所有这些,只是为了对抗机器人的“乐于助人”。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6673271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档