带通知的后台服务

时间:2018-05-26 09:53:54

标签: java android push-notification background-service

我正在开发一个Android应用程序,它调用API来获取数据。现在我想在后台执行此任务,每次在列表视图中更改数据时,都应生成通知。

我怎样才能做到这一点?

如何在后台调用我的API以及如何生成通知。 我是服务和BroadcastReceivers的新手,所以请帮助我

我用这种方式调用服务:

startService(new Intent(this, MyService.class).putExtra("Background",true));

我创建此代码以进行测试。要检查是否可以在后台调用通知,即使应用已关闭。

我的服务类

public class MyService extends Service {

private Boolean isShowingNotification = true ;
NotificationManager notificationManager;
@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStartCommand(intent, flags, startId);


    if (intent.hasExtra("Background")) {
        if (isShowingNotification) {
            StopImportantJob();
            stopSelf();
        } else
            DoImportantJob();
    } else {
        DisplayNotification("Now showing the demo");
    }

    return START_NOT_STICKY;
}

@Override
public void onCreate() {
    super.onCreate();
    notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Toast.makeText(this, "On Create Called", Toast.LENGTH_SHORT).show();
}

@Override
public void onDestroy() {
    super.onDestroy();
    notificationManager.cancelAll();
}

public void DisplayNotification(String message){

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, MainActivity.class), 0);
    Notification notification = new Notification.Builder(this)
            .setContentTitle(message)
            .setContentText("Touch to off Service")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentIntent(pendingIntent)
            .setOngoing(false)
            .build();

    notificationManager.notify(0,notification);

}

public void DoImportantJob(){

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, MainActivity.class), 0);
    Notification notification = new Notification.Builder(this)
            .setContentTitle("New mail from " + "test@gmail.com")
            .setContentText("Subject")
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentIntent(pendingIntent)
            .setOngoing(false)
            .build();

    startForeground(1992, notification);
    isShowingNotification =true;
}

public void StopImportantJob(){

    stopForeground(true);
    isShowingNotification = false;
    if(false){
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ){
            stopForeground(STOP_FOREGROUND_DETACH);
            stopForeground(STOP_FOREGROUND_REMOVE);

        }

    }
}

}

我相信我应该做的事情如下所示,如果我错了,请纠正我。

  1. 在应用程序的MainAcitivity的onCreate()中启动服务。
  2. 在Service调用中,我将创建一个用于执行API调用的方法。
  3. on notifyDataSetChanged();将调用通知方法。
  4. 现在问题是:在Service类中,将在onCreate()或onStartCommand()中调用API方法。

1 个答案:

答案 0 :(得分:0)

  

现在我想在后台执行此任务,每次数据都是   在列表视图中更改,应生成通知。怎么能   我实现了这个?如何在后台调用我的API,怎么做   我生成通知。

首先确定当您的应用程序位于ForegroundBackground时是否需要此操作。现在,if Foreground,您可能不想使用Service类,而是使用AsyncTask来进行Web服务调用,并在任务完成后生成通知并更新列表视图。 If Background,您可以创建IntentService并在那里进行API操作。但是,在后台模式下,您的应用程序无需收到通知,因为客户端无法看到您的应用程序。