我正在使用正在运行的服务来检测网络是否可用。当它不可用时,它会调用一个活动来启动,该活动显示一个空白屏幕,其上显示“无网络可用”。当网络恢复时,它会发送广播来完成此活动。
唯一的问题是此活动可能随时开始(作为弹出窗口),即使在使用其他应用时也是如此。我希望它只在网络外出并且我的应用程序在前台时启动(或可见)。有什么帮助吗?
答案 0 :(得分:2)
一种选择是让您的前台活动注册广播,然后在活动中显示相关通知。
或者,您可以在前台活动开始/恢复时启动服务(即onResume),并在活动离开前台时停止服务。
您可以在服务中使用START_STICKY,以确保它在您停止之前保持不变,如下所示:
@Override
public int onStartCommand(Intent intent, int flags, int startId){
//On start work here
return START_STICKY;
}
然后当您的活动离开前景时(即暂停),使用stopService停止服务。
如果您需要跨多个活动的前一种行为,您可以register以编程方式广播接收者:
BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(MY_ACTION.equals(intent.getAction()))
{
//show appropriate dialog
}
}
};
IntentFilter myIntentFilter = new IntentFilter();
myIntentFilter.addAction(MY_ACTION);
registerReceiver(myBroadcastReceiver,myIntentFilter);
你可以unregister这样:
unregisterReceiver(myBroadcastReceiver);
您可以扩展Activity并创建自己的自定义子类,重复使用类似的代码在进入/离开前台时注册和取消注册。或者您可以将其提取到实用程序方法/类中,并从适当的位置调用。
答案 1 :(得分:1)
我认为你需要共享偏好才能做到这一点。在您活动的finish
上存储一个布尔值(您可以使用onpause()
或onStop()
)并显示弹出窗口,检查值并执行您想要的操作
用于强调使用 sharePreference ,请参阅this和developer.android.com
答案 2 :(得分:1)
尝试以下方法:
Intent intent = new Intent(this, YourActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(intent);
这适用于我自己的应用已经运行的环境,我不确定它是否会启动你的应用程序,如果它还没有在后台运行
编辑:不确定我是否完全理解你的问题。如果您只希望此活动在您的应用程序位于前台时到达前台,请删除addFlags
行,您也可以执行一些布尔值来检查您的应用是否位于前台{{3}这样,如果应用程序不在前台,您的代码甚至无法运行。
编辑:有几种方法可以检查您的应用是否位于前台,我上面发布的链接有一个这样的解决方案,另一种方法是创建一个static boolean isForeground
变量:onResume()
您的应用设置isForeground = true
和onPuase()
设置isForeground = false
的方法。这不是最佳做法,使用ActivityManager
会更好,但出于测试目的,这应该没问题。
然后有如下内容:
if(isForeground){
//Start your activity
}
这应该快速编写,如果这是您想要的行为,我建议将isForeground
静态变量替换为我发布的链接中由ActivityManager
提供的前景测试。