当应用处于后台时,如何从广播接收器将数据发送到活动界面?

3

我正在使用Android Studio编写代码,但我正在编写的项目没有GUI,并且从不更新用户的视图。它仅仅监听上一个安装的应用程序,然后将信息发送到另一个Java文件。

我想知道如何从广播接收器向活动(也许不应该是“activity”,而是“service”?)发送字符串,并在应用程序在后台运行时实现此功能。

目前,我有一个广播接收器在我手机上监听最后安装的应用程序(这在后台运行)。我设置了一个自定义广播接收器来通知我的主活动当广播接收器得到了安装的应用程序。但是这个自定义接收器在后台不起作用。或许我不应该使用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;
    }
}

}

在我的MainActivity中的onCreate方法中,我注册了一个接收器:

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

我接收来自广播接收器的数据。
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中取消注册接收器,但显然这样做将不允许我在应用程序转入后台时从广播接收器接收信息。

@Override
public void onStop()
{

    try{

        unregisterReceiver(broadcastReceiver);
    }

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

    super.onStop();
}
1个回答

4
说实话,我认为更新处于后台的Activity不是一个好的做法(即使可能)。
根据DOCS
活动是用户可以执行的单个、专注的事情。几乎所有的活动都与用户交互,因此Activity类负责为您创建一个窗口,在其中可以使用setContentView(View)放置UI。虽然活动通常呈现给用户作为全屏窗口,但它们也可以以其他方式使用:作为浮动窗口...或嵌入另一个活动中(使用ActivityGroup)。
因此,如果Activity在后台,它就不可见。所以,更新它的内容是无用的(因为用户看不到它)。
实际上,你应该实现以下行为:
  • 仅使用您的服务将信息保存到数据库/内容提供者中,并通知Activity有新信息可用。然后,如果您的Activity已经打开,它会立即使用该信息。如果Activity没有打开,则该信息保留以供用户需要时使用。

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

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

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


感谢您的回答。我完全同意你的观点。但是为了补充我的问题,我想我的“应用程序”永远不需要用户界面。从这个意义上说,它不是真正的应用程序,而只是一个在Android Studio中编写的运行程序。如果是这种情况,那么我的“MainActivity”应该转换为服务吗?这是最好的解决方案,还是有其他方法,如果我只需要我的应用程序一直运行以侦听安装的应用程序,并且任何视图中都没有更新。 - Natalie
嗯...由于您没有GUI,您不需要Activity...也许,您只需要广播接收器。接收器接收操作并执行您所需的所有任务...如果您可以在接收器中执行所有任务,则也不需要服务... - guipivoto
我会试着玩一下。谢谢。 - Natalie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接