我有一个使用蓝牙的应用程序,如果在设备上关闭蓝牙,则无法访问。
我选择实现这个的方式如下:
noBtScreen
,如果已启用,则会转到yesBtScreen
问题是,当用户到达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
答案 0 :(得分:1)
android:noHistory="true"
和noBtScreen
将yesBtScreen
放在清单中。
以下是android文档关于noHistory的内容:
值“true”表示活动不会留下历史记录 跟踪。它不会保留在任务的活动堆栈中,所以 用户将无法返回。
修改强>
我有另一个建议,希望能有效。
当您从调度员活动startActivity
时,您可以使用密钥名称"randomExtra"
传递额外费用
然后在其他活动的onResume
或onCreate
中检查是否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)
尝试一下这个:
为BroadcastReceiver
注册android.bluetooth.adapter.action.STATE_CHANGED
(查看this),它会在蓝牙开启或关闭时通知您。
使用onReceive()
BroadcastReceiver
方法存储它的位置。您可以使用共享偏好。
当您的noBtScreen
到达前台时,覆盖onResume()
方法并检查此变量,如果bluetooth
已开启,则startactivity(yesBtScreen)
并完成() noBtScreen
。
您可以对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数据。如果意图没有附加内容,那么您将返回登录屏幕。
希望这会有所帮助。