Android:使用主页按钮留下应用程序,并在长按主页按钮时返回到不同的活动

时间:2011-09-21 22:19:37

标签: android android-layout android-manifest

我有一个使用蓝牙的应用程序,如果在设备上关闭蓝牙,则无法访问。

我选择实现这个的方式如下:

  1. 创建了一个调度程序活动,该活动在首次启动应用程序时启动。
  2. 此活动检查蓝牙的状态,如果bt关闭,则会将您发送至noBtScreen,如果已启用,则会转到yesBtScreen
  3. 问题是,当用户到达noBtScreen然后点击主页按钮时,更改bt状态并返回到应用程序(通过长按主页按钮并选择我的应用程序)它到达此时不应该达到的noBtScreen

    显然有一些天真的方法可以解决这个问题,例如,我可以检查活动onResume中的bt状态,但我认为应该在这里使用“正确”的解决方案。

    我已经尝试过清单文件中的一些活动设置 具体来说,我尝试在NoBtTask上添加以下标志:
    android:finishOnTaskLaunch
    android:allowTaskReparenting组合使用,而不是与 android:clearTaskOnLaunch
    android:alwaysRetainTaskState

    我也尝试将此.finish添加到noBtActivity::onStop方法,但这也没有帮助(当时发生的事情是我进入了一次,下了车,当我再次进入时,没有发生任何事情,我留在主屏幕上,当我再次尝试它时,它确实把我带到了调度员活动,有趣的是看到这个日志:

      

    09-21 17:54:49.511:INFO / ActivityManager(115):从pid 12603开始:Intent {cmp = com.test.elad / .NoBtActivity}

         

    09-21 17:54:49.523:ERROR / Elad(12603):NoBtActivity.onCreate

         

    09-21 17:54:49.527:ERROR / Elad(12603):NoBtActivity.onStart

         

    09-21 17:54:49.527:ERROR / Elad(12603):NoBtActivity.onResume

         

    09-21 17:54:49.765:INFO / ActivityManager(115):显示com.test.elad / .NoBtActivity:+ 248ms

         

    09-21 17:54:51.867:ERROR / Elad(12603):NoBtActivity.onSaveInstanceState

         

    09-21 17:54:51.867:ERROR / Elad(12603):NoBtActivity.onPause

         

    09-21 17:54:51.867:INFO / ActivityManager(115):开始:意图{act = android.intent.action.MAIN cat = [android.intent.category.HOME] flg = 0x10200000 cmp = com。来自pid 115的android.launcher / com.android.launcher2.Launcher}

         

    09-21 17:54:51.882:VERBOSE / RenderScript_jni(195):surfaceCreated

         

    09-21 17:54:51.882:VERBOSE / RenderScript_jni(195):surfaceChanged

         

    09-21 17:54:52.277:ERROR / Elad(12603):NoBtActivity.onStop

         

    09-21 17:54:56.183:INFO / ActivityManager(115):开始:意图{act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] flg = 0x10100000 cmp = com。来自pid 115的test.elad / .DispatcherActivity}

         

    09-21 17:54:56.265:ERROR / Elad(12603):NoBtActivity.onDestroy

8 个答案:

答案 0 :(得分:1)

android:noHistory="true"noBtScreenyesBtScreen放在清单中。

以下是android文档关于noHistory的内容:

  

值“true”表示活动不会留下历史记录   跟踪。它不会保留在任务的活动堆栈中,所以   用户将无法返回。

修改

我有另一个建议,希望能有效。

当您从调度员活动startActivity时,您可以使用密钥名称"randomExtra"传递额外费用

然后在其他活动的onResumeonCreate中检查是否intent.hasExtra("randomExtra"),然后如果返回true,则继续。如果返回false,则执行startActivity(new Intent(context, DispatcherActivity.class)

答案 1 :(得分:1)

finish()回调活动中致电onUserLeaveHint()

答案 2 :(得分:0)

尝试在清单中为调度程序活动指定android:launchMode =“singleTask”。

答案 3 :(得分:0)

首先,如果您要将finish()放在onPause()方法中的任何位置。移出主动显示活动后立即调用onPause。

有了这个说你需要检查这些意图标志...更具体地看: http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_SINGLE_TOP

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY

编辑:此处还有一个由系统设置的标志,您可以检查该标志是否从活动堆栈历史记录中启动了该活动:http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

Edit2:WOW我看到一些非常复杂的答案!除了有条件的说法之外,OP只需要确保不能再次调用活动。 Intent标志足以执行此任务。

不要过于复杂!

答案 4 :(得分:0)

这可能无法准确回答您的问题,因为它提出了一种不同的方法,但希望它至少对其他观众有用。这就是我要做的事情:

应用程序最初启动一个(BluetoothEnforcerActivity),这是一个空白屏幕。在onResume()中,检查蓝牙的状态。如果蓝牙不可用,请显示警告对话框,通知用户必须启用蓝牙才能继续。该对话框将有“退出”和“再试一次”按钮。

“退出”当然会退出对话框和BluetoothEnforcerActivity(将用户带回主屏幕)。 “再试一次”将退出对话框,BluetoothEnforcerActivity将在onResume()中再次测试蓝牙。 (如果蓝牙仍然不可用,只需再次显示对话框。确保有足够的暂停,用户可以告诉对话框已关闭并重新打开。)

如果/当蓝牙最终可用时,BluetoothEnforcerActivity启动主要活动并调用自己的finish()方法。

所有这一切,不要忘记考虑用户在超过BluetoothEnforcerActivity后禁用蓝牙的情况。

答案 5 :(得分:0)

我的建议是创建一个从Activity(BTActivity)扩展的新类 并使NoBtActivity和YesBtActivity从BTActivity扩展。

现在,在BTActivity Override onRestart上并检查其中的蓝牙状态,如果它处于打开状态且你在NoBtActivity上,则更改为YesBtActivity,反之亦然。

答案 6 :(得分:0)

尝试一下这个:

  1. BroadcastReceiver注册android.bluetooth.adapter.action.STATE_CHANGED(查看this),它会在蓝牙开启或关闭时通知您。

  2. 使用onReceive() BroadcastReceiver方法存储它的位置。您可以使用共享偏好。

  3. 当您的noBtScreen到达前台时,覆盖onResume()方法并检查此变量,如果bluetooth已开启,则startactivity(yesBtScreen)并完成() noBtScreen

  4. 您可以对yesBtScreen进行相同检查,如果bluetooth已关闭startactivity(noBtScreen),则完成()yesBtScreen

答案 7 :(得分:0)

我制作了一个在开始时有登录屏幕的应用。离开应用程序并返回将意味着返回登录屏幕。这就是我如何解决它 - 它需要使用意图来保存数据。 (我有4个活动 - 主要活动,第二次活动,登录设置活动和登录活动)

关于主要活动我有这个:

@Override
protected void onUserLeaveHint() {
    super.onUserLeaveHint();

    Intent intent = getIntent();
    String activity = intent.getStringExtra("activity");
    if (activity == null || !activity.equals("first") || !activity.equals("firsttime")){
        NavUtils.navigateUpFromSameTask(MainActivity.this);
    }else {
        getIntent().removeExtra("activity");
    }
    System.out.println("mainactivity");
}

关于我的第二项活动我有这个:

private void returning(){
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("activity","first");
    startActivity(intent);
}

在我的登录设置活动中,我有这个(在onclick上登录):

    Intent i = new Intent(LoginSetup.this, MainActivity.class);
    i.putExtra("activity","firsttime");
    startActivity(i);

因此,每次我在活动之间移动时,某些内容都存储在intent extras中,当我离开活动时,会检查intent以查看它是否包含intent数据。如果意图没有附加内容,那么您将返回登录屏幕。

希望这会有所帮助。