繁体   English   中英

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

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

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

我想知道如何从广播接收器向活动发送字符串(也许这不应该是“活动”而是“服务”吗?),并且在应用程序处于后台时进行这项工作。

现在,我有一个广播接收器,正在侦听手机上最后安装的应用程序(此应用程序在后台运行)。 我设置了一个自定义广播接收器,以在广播接收器安装了应用程序时通知我的主要活动。 但是此自定义接收器无法在后台运行。 同样,也许我不应该使用Activity从BroadcastReceiver接收信息?

在后台运行应用程序时,是否可以将信息从广播接收器发送到主要活动? 我还需要我的主要活动来在后台恢复正常功能(在后台时没有完成GUI更新)。

我的BroadcastReceiver通过新的Intent向我的主活动发送数据

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

老实说,我认为更新处于后台的活动不是一个好习惯(即使可能)。

根据DOCS

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

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

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

  • 仅将您的服务用于保存信息(在数据库/内容提供程序中),并通知活动有新信息可用。 然后,如果您的活动处于打开状态,它将立即使用该信息。 如果未打开“活动”,则该信息将保留,以备用户需要时使用。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM