我的应用程序在后台时如何显示通知?

时间:2018-06-26 11:27:17

标签: java android notifications background broadcastreceiver

我正在尝试构建一个具有-

的Android应用程序

a 首次活动启动者活动

第二活动

我要实现的目标:

First Actvity从用户处获取输入,并使用 AsyncTaskLoader 从网络中获取数据。  在 onLoadFinished 中,它检查输入是否有效,是否启动了第二个活动的意图以显示更多详细信息。输入也与Intent一起传递。

由于网络操作可能会花费一些时间,因此我决定在创建第二个活动之前使用 IntentService 显示通知,即在 onLoadFinished 中调用该通知。意向。如果该通知尚未启动,则应直接启动它。

什么工作正常:

活动和加载程序都工作正常。通知也会显示出来,并且只要用户保持应用程序运行,一切都会按预期进行。

什么不是:

当用户正在加载数据时离开“第一活动”时,由于执行了 onPause ,因此不会显示该通知。我尝试搜索它,并了解了 BroadcastReceiver JobScheduler FirebaseJobDispatcher ,但我无法真正理解它们以及它们如何提供帮助。

那么,我走对了吗?而且即使应用程序进入后台,我如何也能实现相同的功能?

P.S。代码远远超出问题所暗示的范围,所以我没有包含它。这就是为什么如果解释不完整或混乱的原因,我会尽力澄清您的疑问。

4 个答案:

答案 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 servicesintent 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类似。即使活动已关闭但通知尚未关闭,它也允许您的通知做出响应。

同样,这只是针对这种特定情况的解决方法,导致我在许多地方传递输入变量,因此在性能上可能不如其他选项有效。