Android:如何检查应用程序是不是已被带到后台以避免不需要的 BroadcastReceiver 检查

Posted

技术标签:

【中文标题】Android:如何检查应用程序是不是已被带到后台以避免不需要的 BroadcastReceiver 检查【英文标题】:Android: How to check that the application has been brought to the background for avoiding not needed BroadcastReceiver checksAndroid:如何检查应用程序是否已被带到后台以避免不需要的 BroadcastReceiver 检查 【发布时间】:2014-03-29 00:00:41 【问题描述】:

这个问题很简单:

说明:

我正在做的是有一个广播接收器,每次 GPS 的状态发生变化(启用或禁用)时都会调用它,并在 GPS 被禁用时通知用户,邀请他重新启用它(启动相关意图) .

我在我的应用程序的根活动中启用(并最终禁用)它,这样每个子活动都会调用它。

当用户按下 HOME 按钮(例如)或打开另一个应用程序并禁用 GPS 时,我的问题就出现了。 通知仍会显示,将我的应用置于最前面。

代码

广播接收器

public class GPSStatusReceiver extends BroadcastReceiver 

    @Override
    public void onReceive(Context context, Intent intent) 
        String provider = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

        if (!provider.contains(LocationManager.GPS_PROVIDER)) 
            Intent gpsIntent = new Intent(context, GPSDialogActivity.class);
            gpsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            gpsIntent.putExtra(GPSDialogActivity.GPS_DIALOG_TITLE, "Attivazione GPS");
            gpsIntent.putExtra(GPSDialogActivity.GPS_DIALOG_MESSAGE, "E' necessario abilitare il GPS. Cliccare su 'Usa satelliti GPS'.");
            context.startActivity(gpsIntent);
        
    

在根 Activity 的 onCreate 和 onDestroy 上启用/禁用 Receiver 检查

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);

    *
    *
    Stuff
    *
    *

    ComponentName component=new ComponentName(this, GPSStatusReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);


@Override
protected void onDestroy() 

    *
    *
    Stuff
    *
    *
    *

    ComponentName component=new ComponentName(this, GPSStatusReceiver.class);
    getPackageManager()
        .setComponentEnabledSetting(component,
            PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
            PackageManager.DONT_KILL_APP);
    super.onDestroy();

主要需求

我需要在应用程序进入后台时禁用 BroadcastReceiver 调用,并在应用程序返回到前台时启用它

什么是最好的

满足以上需求:

如果用户在应用程序处于后台时禁用 GPS(这样他不应该有任何通知),当他再次将应用程序带回前面时,我会拦截它并手动检查 GPS 状态并最终通知用户启用 GPS。

【问题讨论】:

使用Activity的onPause方法? 不,它不起作用,因为如果我在 OnPause 上禁用 BroadcastReceiver ,当我开始一个新的子活动时 OnPause 被调用并且广播将不再起作用。 【参考方案1】:

这是片段有用的原因之一。如果您有一个Activity 管理多个片段,则该活动的onPause()onResume() 将很好地处理注册和注销该接收器,而不会出现子活动的复杂性。

除此之外,我建议将 Activity 子类化为“GpsReceiverActivity”,在其中处理接收器的注册和注销,并将其用作您希望接收广播的所有其他活动的基类。

顺便说一句,问题写得很好。

【讨论】:

非常好的答案,我没想到。我将尽快进行此更改,因为我的整个解决方案有 40 个活动......这将需要一段时间。我会尽快告诉你结果。对我的问题 +1 表示赞赏(我把它给了你) 完美运行!我正在为我的项目中的每个活动开始迁移到这个自定义类......多么漫长的工作!

以上是关于Android:如何检查应用程序是不是已被带到后台以避免不需要的 BroadcastReceiver 检查的主要内容,如果未能解决你的问题,请参考以下文章

如何始终在后台运行服务?

明确识别是不是在后台启用了android服务位置和gps

如何检查用户是不是已在 React Native Android 中授予相机权限?

检查是不是启用了“访问我的位置” - Android

如何检查 Fragment 是不是从后台恢复?

检查应用程序是不是正在运行(后台或前台)Android