当应用程序处于后台时,将数据从 BroadcastReceiver 发送到 activity

Send data from BroadcastReceiver to activity, while app is in background

我正在 Android Studio 中编写代码,但我正在编写的项目没有 GUI,并且从不为用户更新视图。它只是使用广播接收器侦听最后安装的应用程序,并将信息发送到另一个 java 文件。

我想知道如何将一个字符串从广播接收器发送到一个 activity(也许这不应该是一个 "activity",而是一个 "service"?),并让这个在应用程序处于后台时工作。

现在我有一个广播接收器监听我 phone 上最后安装的应用程序(它在后台运行)。我有一个自定义广播接收器设置为在广播接收器安装应用程序时通知我的主要 activity。但是这个自定义接收器在后台不起作用。同样,也许我不应该使用 Activity 从 BroadcastReceiver 接收信息?

有什么方法可以在应用程序处于后台时将信息从我的广播接收器发送到我的主activity?我还需要我的 main activity 在后台恢复正常功能(在后台时没有完成 GUI 更新)。

我的 BroadcastReceiver 通过新的 Intent

向我的 Main Activity 发送数据
public class NewInstallReceiver extends BroadcastReceiver {

ApplicationInfo ai;

@Override
public void onReceive(Context context, Intent intent) {

    final PackageManager pm = context.getPackageManager();

    try {

        // if app is added, get package info

        ai = pm.getApplicationInfo(intent.getData().getSchemeSpecificPart(), 0);

        Intent i = new Intent("broadcastName");
        // Data pass to activity
        i.putExtra("appInfo", ai);
        context.sendBroadcast(i);

    } catch (final PackageManager.NameNotFoundException e) {
        ai = null;
    }
}

}

在我的 MainActivity 的 onCreate 中,我注册了接收器:

registerReceiver(broadcastReceiver, new IntentFilter("broadcastName"));

我从 BroadcastReceiver 接收数据

BroadcastReceiver broadcastReceiver =  new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        // get applicationInfo
        Bundle b = intent.getExtras();
        Object applicationInfo = b.get("appInfo");

        ApplicationInfo appInfo = (ApplicationInfo) applicationInfo;

        getNewData(appInfo);
    }
};

然后我必须在 MainActivity 中取消注册接收器,但显然这不允许我在应用程序进入后台后从 BroadcastReceiver 接收信息

@Override
public void onStop()
{

    try{

        unregisterReceiver(broadcastReceiver);
    }

    catch(Exception e){
        System.out.println("Exception is " + e.toString());
    }

    super.onStop();
}

老实说,我不认为在后台更新 Activity 是一个好习惯(即使可能)。

根据DOCS

An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View). While activities are often presented to the user as full-screen windows, they can also be used in other ways: as floating windows... or embedded inside of another activity (using ActivityGroup).

所以,如果 Activity 在背景中,它是不可见的。所以,更新它的内容是没有用的(因为它对用户不可见)。

事实上,您应该改为实现以下行为:

  • 仅将您的服务用于保存信息(在 database/content 提供商中)并通知 Activity 有新信息可用。然后,如果您的 activity 已打开,它会立即消耗该信息。如果 Activity 未打开,信息将保留以供用户需要时使用。

  • 如果应用程序只是停止了,您可以在 onResume() 方法期间更新 Activity 内容。

  • 如果您的应用被终止并且用户再次打开它,您可以在 onCreate() 方法期间更新所有视图。 onCreate() 在向用户显示视图之前调用。

这样,信息将在需要时更新:当用户想要查看信息时。否则就是浪费时间。