[英]Android : Activity not called from BroadcastReceiver when app is in background
[英]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.