首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将数据从BroadcastReceiver发送到活动,而app处于后台

将数据从BroadcastReceiver发送到活动,而app处于后台
EN

Stack Overflow用户
提问于 2016-07-04 19:22:26
回答 1查看 1.5K关注 0票数 2

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

我想知道如何从一个广播接收器发送一个字符串到一个活动(也许这不应该是一个“活动”,而是一个“服务”?),并有这项工作,而应用程序在后台。

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

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

我的BroadcastReceiver,它通过一个新的意图向我的主要活动发送数据。

代码语言:javascript
运行
复制
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 In onCreate”中,我注册了接收器:

代码语言:javascript
运行
复制
registerReceiver(broadcastReceiver, new IntentFilter("broadcastName"));

我从BroadcastReceiver接收数据

代码语言:javascript
运行
复制
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接收信息。

代码语言:javascript
运行
复制
@Override
public void onStop()
{

    try{

        unregisterReceiver(broadcastReceiver);
    }

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

    super.onStop();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-04 20:02:42

老实说,我不认为更新背景活动是一个很好的实践(即使可能)。

根据文档

一个活动是一个单一的,集中的事情,用户可以做。几乎所有的活动都与用户交互,因此Activity类负责为您创建一个窗口,您可以在其中使用setContentView(视图)放置UI。虽然活动通常以全屏窗口的形式呈现给用户,但也可以以其他方式使用:作为浮动窗口.或者嵌入到另一个活动中(使用ActivityGroup)。

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

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

  • 仅使用您的服务保存信息(在数据库/内容提供程序中),并通知活动新信息可用。然后,如果您的活动是打开的,它会立即消耗该信息。如果活动未被打开,信息将保存到用户需要的时候。
  • 如果仅停止app,则可以在onResume()方法期间更新活动内容。
  • 如果您的应用程序被杀死,用户再次打开它,您可以在onCreate()方法期间更新所有视图。在视图显示给用户之前调用onCreate()

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38191098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档