Android启动系统设置而不是我的应用程序

时间:2011-03-10 15:29:00

标签: android android-activity android-intent

出于某种原因,每当我(尝试)启动我的应用程序时,手机决定启动系统设置而不是我的“主要活动”。是的,我指的是“Android系统设置”,而不是我的应用程序。

这只发生在我的手机上,我想这可能与我的应用刚刚打开系统设置的事实有关,当我决定用Eclipse的新版本重新启动时。

可以从Eclipse中启动应用程序,但是当我从应用程序导航回来时,它会返回到系统设置而不是主屏幕,就像首先启动设置活动然后启动我的活动一样。如果我然后从手机启动应用程序,我得到的只是系统设置。

应用程序正在侦听特定URL子字符串的VIEW操作,当我使用匹配的URL启动应用程序时,我得到的结果与从Eclipse启动应用程序时相同,应用程序启动,但是当我返回时,我返回设置。

我已经尝试使用谷歌搜索这个问题,当应用程序被杀死时,我所能找到的只是Android saving state,但没有任何关于如何重置此状态的信息。我试过卸载应用程序,查杀系统设置,重新启动手机,重新安装,清除应用程序数据..没有运气..

对于它的价值,这里是清单中我的主要活动的定义,

<activity android:name=".HomeActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:clearTaskOnLaunch="true" android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW"></action>
        <category android:name="android.intent.category.DEFAULT"></category>
        <category android:name="android.intent.category.BROWSABLE"></category>
        <data android:pathPrefix="/isak-web-mobile/smart/" android:scheme="http" android:host="*"></data>
    </intent-filter>
 </activity>

这是我尝试启动应用程序时的logcat行,没有任何关于任何设置的内容。

I/ActivityManager( 1301): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=se.opencare.isak/.HomeActivity }

当我从Eclipse启动时,我也得到了这一行(正如人们所期望的那样),

I/ActivityManager( 1301): Start proc se.opencare.isak for activity se.opencare.isak/.HomeActivity: pid=23068 uid=10163 gids={3003, 1007, 1015}

如果重要的话,手机是HTC Desire Z,运行2.2.1。

目前,这是我的HomeActivity,

public class HomeActivity extends Activity {
    public static final String TAG = "HomeActivity";

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(TAG, "onActivityResult(" + requestCode + ", " + resultCode + ", " + data + ")");
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate(" + savedInstanceState + ")");
        super.onCreate(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
        Log.d(TAG, "onDestroy()");
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        Log.d(TAG, "onPause()");
        super.onPause();
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onPostCreate(" + savedInstanceState + ")");
        super.onPostCreate(savedInstanceState);
    }

    @Override
    protected void onPostResume() {
        Log.d(TAG, "onPostResume()");
        super.onPostResume();
    }

    @Override
    protected void onRestart() {
        Log.d(TAG, "onRestart()");
        super.onRestart();
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.d(TAG, "onRestoreInstanceState(" + savedInstanceState + ")");
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onResume() {
        Log.d(TAG, "onResume()");
        super.onResume();
    }

    @Override
    protected void onStart() {
        Log.d(TAG, "onStart()");
        super.onStart();
    }

    @Override
    protected void onStop() {
        Log.d(TAG, "onStop()");
        super.onStop();
    }

    @Override
    protected void onUserLeaveHint() {
        Log.d(TAG, "onUserLeaveHint()");
        super.onUserLeaveHint();
    }
}

没有(上述内容)写入日志。

在阅读Blundell的回复后,我尝试更改launchMode / clearTaskOnLaunch设置,结果如下:

  • 情况A - 我删除了launchMode和clearTaskOnLaunch:与之前相同的问题
  • 情况B - 我删除了clearTaskOnLaunch并保持launchMode =“singleInstance”:另一个问题   
        
    • 打开应用 - 我的HomeActivity正在显示
    •   
    • 点击按钮在我的应用程序中打开另一个活动 - 它将按原样打开
    •   
    • 点击系统后退按钮 - 它返回系统设置
    •   
    • 再次点击系统后退按钮 - 我将返回到我的HomeActivity
    •   
    • 再点击后退按钮会将我带回Android主屏幕
  • 情况C - 我只删除了launchMode并保持clearTaskOnLaunch:与以前一样的问题
  • Sitatuion D - 我删除clearTaskOnLaunch并设置launchMode =“singleInstance”:与情况B相同

4 个答案:

答案 0 :(得分:3)

您没有从HomeActivity调用setContentView()(根据您添加的代码)。当它不存在时,不同的设备表现不同,就像在模拟器上你会看到“应用程序没有安装在你的手机上”。尝试设置内容视图。

答案 1 :(得分:1)

我在手机上测试了这个,但这似乎在这里正常工作...... 如果您尝试创建新项目,然后将代码复制到其中,该怎么办? 它对我有用,也许它会对你有用......

我怀疑它与您的Eclipse版本更改有关,可能会使用您之前使用的版本中的某些不同设置,因此将初始设置渲染为无用...

答案 2 :(得分:0)

My 2Cents

您可以查看应用程序的启动活动。

基本上我认为可能会发生的是,您的应用程序是在与设置相同的“堆栈”中启动的,因此操作系统会将设置推送到屏幕,然后将您的活动加载到该堆栈的顶部。 / p>

您可以尝试添加:

android:launchMode="singleInstance"

到您的清单文件的<activity />标记中。这将为您的应用程序启动一个新堆栈,您的应用程序

这可能会解决问题,但可能还有其他原因,这可能会导致不良影响,具体取决于您的应用的工作方式。请查看文档以获取更多信息:Android:LaunchMode

修改

阅读您的清单,为什么不删除android:launchMode="singleTop"并让它以默认值启动?

此外,您将此配对:android:clearTaskOnLaunch,因为操作系统具有设置活动,您的活动具有相同的任务它可能会将其清除为“根”活动,即设置和不是你的应用。你有这个原因,删除它并再试一次吗?

答案 3 :(得分:0)

请注意,我不是Android开发者,但我拥有Android手机,并认为此问题非常有趣。

总结一下我到目前为止所读到的关于这个问题的内容,我认为以下可能是这个问题的根本原因:

  • 您使用clearTaskOnLaunch,它会在您的应用程序启动时清除所有意图/活动/任务/ whatever_buzzword_is_used_for_this。
  • Android似乎永远记住应用程序的最后一个状态(我现在称之为)全局内部状态数据库(简称GISD),这个数据库无法轻易擦除(至少不能卸载应用程序,重新启动,清算意图等。)。
  • Android尝试使用它的最后状态重新打开应用程序。如果没有当前活动,则此信息来自GISD,因此在您的情况下,它是“系统设置”。
  • 擦除GISD中的状态是没有办法(或者不知道如何)。 (你的问题是如何做到这一点。)

如果这是真的,这显然是手机问题,这是Android中的一个主要错误,因为你可能会破坏应用程序!您所要做的就是:

  • 以某种方式引发类似clearTaskOnLaunch的类似事情 - 这应该是可能的 - 用于你想要砖的应用程序。
  • 欺骗应用程序以启动其他应用程序,如“系统设置” - 许多应用程序执行此操作以启用WiFi或类似功能,但我认为一些聪明的人(读:不是我)会找到一种方法来实现这一点应用
  • 现在以此状态终止应用程序。

Android会在GISD中记住该状态,如果您尝试从主屏幕启动应用程序,将来会失败。好的。

然而,即使没有修复,希望可以以同样的方式恢复应用程序:

  • 使用活动启动您的应用程序,以便启动它。在你写的时候,这适合你。
  • 应用clearTaskOnLaunch的功能。 (我真的不知道怎么做,但你作为Android开发人员可能知道。)
  • 让您的应用程序启动第三个应用程序,使第三个应用程序成为全局状态。
  • 杀死你的申请。

也许时间和顺序很重要,所以也许你必须在应用程序被杀之后离开第三个应用程序,也许你必须在合适的时间拔掉手机的电池,也许你必须使用一些奇怪的ADB来防止你的手机做正确的事情,也许你需要另一系列动作或者某些事情仍然缺失,无论如何,即使找出如何激发你的错误类型也很困难 - 但多亏了你的发现我们知道有这样的事情。

如果你可以让Android从主屏幕而不是你的应用程序启动第三个应用程序,这将证实,你确实可以解决这个问题。如果这不起作用,那么就不可能阻止Android调用系统设置而不是你的应用程序,那么Android当然有一个大问题,因为很可能有人找到了一种方法来永久地将所有这些珍贵的手机中的应用程序包括在内( ab)使用那个bug。

如果上一步有效,那么现在的最后一步是让第三个应用程序重新启动到应用程序的主屏幕:

  • 启动您的申请。
  • 这将启动第三个应用程序。
  • 应用clearTaskOnLaunch所做的事。
  • 让第三个应用程序启动应用程序的主屏幕(或任何你想要的)
  • 杀死第三个应用程序(也许是你的应用程序)。

现在全局活动状态将再次回到您的应用程序 - 如果一切顺利,第三个应用程序也不应该受到伤害。

请注意,我不确定这是否真的可以完成,因为我无法自己测试。说了这些,我同意我们当然需要一个更好的方法来解决这个问题!

但有趣的是看看会发生什么,如果你的应用程序具有第三个应用程序的状态而第三个应用程序具有应用程序的状态。这会导致无限循环吗?

有趣的是,如果您卸载第三个应用程序会发生什么。这是否会清除自动启动到该应用程序中还是会让您无助?

作为Android手机(仅限),我必须说,你发现这是一个非常糟糕的混乱。这就是为什么我有兴趣,如果有一个修复,因为进行工厂重置不能被视为解决方案。阅读:这不仅是开发人员的问题,也会影响Android用户。

PS:请原谅我,我的英文不好,这篇文章的长度,没有使用正确的流行语和发布我不是专家的问题,所以我的答案有点OT。不过我是用HTH做的。