将数据从BroadcastReceiver发送到活动,而应用程序位于后台

时间:2016-07-04 19:22:27

标签: java android android-intent android-activity broadcastreceiver

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

我想知道如何将广播接收器中的字符串发送到活动(也许这不应该是“活动”而是“服务”?),并且在应用程序处于后台时可以进行此操作。

现在我有一个广播接收器正在监听我手机上最后安装的应用程序(这在后台运行)。我有一个自定义广播接收器设置为当广播接收器获得安装的应用程序时通知我的主要活动。但是这个自定义接收器在后台不起作用。再说一次,也许我不应该使用Activity来接收来自BroadcastReceiver的信息?

有什么方法可以在应用程序处于后台时从我的广播接收器向我的主要活动发送信息?我还需要我的主要活动才能在后台恢复正常功能(在后台没有进行GUI更新)。

我的 BroadcastReceiver ,它通过新的意图将数据发送到我的主要活动

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;
    }
}

}

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

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();
}

1 个答案:

答案 0 :(得分:3)

老实说,我不认为更新后台活动是一种很好的做法(即使可能)。

根据DOCS

  

活动是用户可以做的一件重点事。几乎所有活动都与用户交互,因此Activity类负责为您创建一个窗口,您可以在其中使用setContentView(View)放置UI。虽然活动通常以全屏窗口的形式呈现给用户,但它们也可以以其他方式使用:浮动窗口......或嵌入其他活动内部(使用ActivityGroup)。

因此,如果活动在后台,则不可见。因此,更新其内容是无用的(因为它对用户不可见)。

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

  • 仅使用您的服务保存信息(在数据库/内容提供商中),并通知活动新信息可用。然后,如果您的活动是开放的,它会立即消耗该信息。如果未打开活动,则会在用户需要时保留信息。

  • 如果仅停止了应用,则可以在onResume()方法期间更新活动内容。

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

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