我正在尝试构建一个具有-
的Android应用程序a 首次活动(启动者活动)
和第二活动
我要实现的目标:
First Actvity从用户处获取输入,并使用 AsyncTaskLoader 从网络中获取数据。 在 onLoadFinished 中,它检查输入是否有效,是否启动了第二个活动的意图以显示更多详细信息。输入也与Intent一起传递。
由于网络操作可能会花费一些时间,因此我决定在创建第二个活动之前使用 IntentService 显示通知,即在 onLoadFinished 中调用该通知。意向。如果该通知尚未启动,则应直接启动它。
什么工作正常:
活动和加载程序都工作正常。通知也会显示出来,并且只要用户保持应用程序运行,一切都会按预期进行。
什么不是:
当用户正在加载数据时离开“第一活动”时,由于执行了 onPause ,因此不会显示该通知。我尝试搜索它,并了解了 BroadcastReceiver , JobScheduler 和 FirebaseJobDispatcher ,但我无法真正理解它们以及它们如何提供帮助。
那么,我走对了吗?而且即使应用程序进入后台,我如何也能实现相同的功能?
P.S。代码远远超出问题所暗示的范围,所以我没有包含它。这就是为什么如果解释不完整或混乱的原因,我会尽力澄清您的疑问。
答案 0 :(得分:1)
是的。您在正确的轨道上。
这是我制作的地图下载器中的示例。我希望您不介意,但由于您未提供任何背景信息,所以我不得不找到一个合适的示例。
/**
* @param entry the map entry to be downloaded
* @return returns a receiver that unzips the map file after downloading
*/
private BroadcastReceiver createMapReceiver(MapEntry entry) {
return new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
unregisterReceiver(this); // we unregister this receiver after the download is complete
receiveDownloadedFile(entry); // once we receive the map file, we run this function, but you can do whatever you want. This is the part of the code youn were asking for
}
};
}
void downloadMap() {
// preparing the download
BroadcastReceiver receiver = createMapReceiver(entry); // see function above
DownloadManager manager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
String downloadURL = fileListURL + entry.getFileName() + fileExtension; // building the url for the map
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadURL));
if (manager != null) {
manager.enqueue(request
.setDestinationUri(Uri.fromFile(new File(areaFolder, entry.getFolderName())))
.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI|DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false)
.setTitle("Some title, preferably taken from Strings.xml")
.setDescription("Some Description")
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
);
} else {
// if we couldn't find the DownloadManager
onFailure(entry); // we simply run some onFailure function
}
}
别忘了权限。
答案 1 :(得分:1)
通过LocalBroadcastManager注册广播接收器,并定义过滤器。现在,根据过滤器,您可以使用UI元素或意图。
Declare
ShowItem:any[];
....
this.ShowItem.push({
id: ....,
name: ...,
phno :....
})
console.log(this.ShowItem);
or
var array =[];
array.push({
id: ....,
name: ...,
phno :....
})
console.log(array);
尝试一下。我已经实现了,它可以工作。
答案 2 :(得分:0)
即使应用程序进入后台,我如何也能实现相同的功能
使用bound services或intent services。 意向服务允许您异步执行操作。 绑定的服务可以使用aidl提供接口。只要绑定了服务,销毁它的可能性就较小。有多种使用标志绑定服务的方法。
恕我直言,活动只是显示UI的一种方式。如果您需要任何后台工作,请使用服务。 通过艾迪尔使用绑定服务时,必须扩展service connection。绑定后它将从服务接收接口。
答案 3 :(得分:0)
我终于在不使用BroadcastReciever或服务的情况下使它正常工作,因此您当中不熟悉的人可以从中获得参考,但 可以自行决定使用它 因为“服务和接收者”是推荐的方法。
@Override
public void deliverResult(Data data) {
super.deliverResult(data);
showNotification(input);
}
这是AsyncTaskLoader中的一种方法,该方法在获取数据后触发。覆盖它,并更改响应通知单击的通知方法。
private PendingIntent onClick(Context context) {
return PendingIntent.getActivity(context, 0, new Intent(context, ExtraActivity.class).
putExtra(Intent.EXTRA_TEXT,input),PendingIntent.FLAG_UPDATE_CURRENT);
}
ExtraActivity与this类似。即使活动已关闭但通知尚未关闭,它也允许您的通知做出响应。
同样,这只是针对这种特定情况的解决方法,导致我在许多地方传递输入变量,因此在性能上可能不如其他选项有效。