我有一个Android应用程序,有很多活动。有时,错误的活动正在开始。
通常,应用程序子类启动,然后启动活动(StartAct.android:name="android.intent.category.LAUNCHER")做了一些工作,然后启动InitializeActivity.这做了一些工作,然后启动了我的主显示活动(MainAct)。前两个活动进行一些必要的初始化,包括在启动MainAct的意图之前设置一个静态MainAct标志。
活动是使用startActivity()使用特定意图(指定的...activity.class)启动的,并在startActivity()之后调用finish()。
然而,有时会发生这样的事情,我不知道为什么.
简而言之,当点击图标启动应用程序时,它会直接跳转到第三个活动(MainAct)。这将导致应用程序检测错误(isInitialized标志为false)并停止:
Icon:
logs onPause,然后是onStop。应用程序子类拥有的
子类onCreate是调用的,而returns
,没有StartAct__
我遗漏了什么?
注意:由于这个问题,添加了初始化标志。它是在启动主活动的代码中的唯一位置设置的,在主活动中只在onCreate中进行检查。
每个请求清单文件(稍加修改)。请注意,此处的服务目前未使用。
<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>发布于 2011-07-13 02:31:09
应用程序由于内存不足而被关闭的事实对用户来说应该是透明的。这就是为什么当应用程序被杀死时,Android会记住在这个应用程序中运行的最后一个活动,并在用户返回应用程序时直接创建这个活动。
也许您可以在onCreate()方法的Application (或MainAct)中做一些事情,以确保一切都被正确初始化。
顺便说一句,除非你真的需要,否则当用户不使用你的应用程序时,你不应该让工作线程做一些工作。取决于您所做的,这可能会很快耗尽电池,或者使用户认为它可以快速耗尽电池(更糟糕的是,用户将卸载您的应用程序!)
您还可以让应用程序在用户退出应用程序时完成所有活动,
发布于 2017-04-30 07:10:23
这确实是一个“让伤害雪上加霜”的例子--首先Android杀死了我最棒的应用程序,然后当用户重新启动我的应用程序时,Android试图通过启动错误的活动来“有所帮助”,从而导致我的应用程序崩溃。叹一口气。
这里是我非常疯狂的解决办法,以抵消Android的帮助。我的应用程序要求StartActivity必须是第一个活动,因此对于所有其他活动,我在onCreate()方法中添加一行。例如:
public class HelpActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (StaticMethods.switchToStartActivityIfNecessary(this)) return; // <- this is the magic line
...
}
...
}为了完成这项工作,我在应用程序类中添加了一个开关变量:
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的类,它包括以下方法:
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启动时,需要重置开关:
public class StartActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((OutBackClientApplication) getApplication()).setStartActivityStatus(0);
...
}
...
}所有这些,只是为了对抗机器人的“乐于助人”。
https://stackoverflow.com/questions/6673271
复制相似问题