每 1 分钟显示一次通知 Android

Posted

技术标签:

【中文标题】每 1 分钟显示一次通知 Android【英文标题】:Show notification every 1 minute Android 【发布时间】:2020-11-17 06:21:45 【问题描述】:

我想在用户打开应用程序时运行一项服务,然后只要应用程序每 1 分钟安装一次就让它运行。该服务将通过 API 调用检查是否有新订单,如果有则显示通知。

我做了一些研究,发现 JobIntentService 和 Broadcast Reciever 是我需要使用的解决问题的工具,但我无法将它们放在一起使其工作。如果有人可以提供详细的解决方案,我将不胜感激。我也想知道对于我的问题是否有比这更好的方法?以下是我设法编写的代码。

后台服务

public class BackgroundService extends JobIntentService 

    private static final String TAG = BackgroundService.class.getName();

    private static final int JOB_ID = 1;
    private NotificationManager notificationManager;

    public static void enqueueWork(Context context, Intent intent) 
        enqueueWork(context, BackgroundService.class, JOB_ID, intent);
    

    @Override
    public void onCreate() 
        super.onCreate();
        Log.d(TAG, getClass().getSimpleName() + "#onCreate");
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    

    @Override
    public void onDestroy() 
        super.onDestroy();
        Log.d(TAG, "Running in background!");
        sendBroadcast(new Intent(getApplicationContext(), BackgroundService.class));
    

    @Override
    protected void onHandleWork(@NonNull Intent intent) 
        Log.d(TAG, getClass().getSimpleName() + "#onHandleWork!");

        APIInterface service = RetrofitClientInstance.getRetrofitInstance().create(APIInterface.class);
        Call<List<OrdersModel>> call = service.getAllOrders(Services.CONSUMER_KEY,Services.CONSUMER_SECRET);
        call.enqueue(new Callback<List<OrdersModel>>() 
            @Override
            public void onResponse(@NonNull Call<List<OrdersModel>> call,@NonNull Response<List<OrdersModel>> response) 
                if (response.body() != null) 
                    for (OrdersModel orders : response.body())
                        if (orders.getStatus().equals("processing"))
                            sendNotification("#" + orders.getNumber());
                        
                    
                
            

            @Override
            public void onFailure(@NonNull Call<List<OrdersModel>> call,@NonNull Throwable t) 
                Log.d(TAG, getClass().getSimpleName() + "Network Error!");
            
        );
    

    private void sendNotification(String title) 

        Uri defaultSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        Intent intent = new Intent(this, GetOrdersActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

        Notification.Builder notificationBuilder = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher_round)
                .setContentTitle(title)
                .setAutoCancel(true)
                .setSound(defaultSound)
                .setContentText("New Order")
                .setContentIntent(pendingIntent)
                .setWhen(System.currentTimeMillis())
                .setPriority(Notification.PRIORITY_HIGH)
                .setCategory(Notification.CATEGORY_MESSAGE);

        notificationManager.notify(0, notificationBuilder.build());

        Log.d("GoParty", "Notification sent ----- ");
    

广播接收器

public class NotificationReceiver extends BroadcastReceiver 

    @Override
    public void onReceive(Context context, Intent intent) 

        Intent notificationIntent = new Intent(context, BackgroundService.class);
        BackgroundService.enqueueWork(context, notificationIntent);
    

【问题讨论】:

除非您想破坏用户的电池,否则您可能需要查看推送通知。 【参考方案1】:

这不是它应该如何工作的。移动设备上的应用程序必须保持电池寿命。轮询做得不好。你想要的是一个推送通知,服务器在其中发挥积极作用。例如,您可以使用 Firebase 云消息传递来实现。

看看:https://firebase.google.com/docs/cloud-messaging/android/client?authuser=0

服务器负责了解何时有新订单可用,并且可以在正确的时刻采取行动,向客户端应用发送推送通知。

【讨论】:

以上是关于每 1 分钟显示一次通知 Android的主要内容,如果未能解决你的问题,请参考以下文章

iOS 11-每 x 分钟重复一次的用户本地通知

iOS 10 - 每“x”分钟重复一次通知

如何每5分钟发送一次通知?

停止本地通知

本地通知 - 重复间隔/自定义时间不起作用

PeriodicWorkRequest 失败 redmi,vivo,oppo