使用Alarm Manager android调度本地通知

时间:2017-05-03 05:18:29

标签: android

我正在使用本地通知开发Android应用程序。我使用服务实现了本地通知。在服务本地通知工作,但当我杀死应用程序服务销毁。通知无效。现在我想使用报警管理器实现本地通知如何使用报警管理器

执行此操作

这是服务类。

import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;

import com.deemsysinc.cyberhealthapp.R;
import com.deemsysinc.cyberhealthapp.weightgoal.WeightGoalActivity;
import com.google.gson.Gson;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;

public class NotificationService extends Service{
    private IBinder iBinder=new MyBinder();
    SharedPreferences prefs;
    SharedPreferences.Editor editor;
    Handler handler;
    // timer handling
    NotificationManager manager;
    Notification myNotication;
    static TimerTask timerTask;

    Date date1;
    Date date2;
    ArrayList<NotificationList> notificationLists;

    int temp=0;


    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return true;
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        handler=new Handler();
        prefs = getSharedPreferences(configuration.AppPrefernce, MODE_PRIVATE);
        editor = prefs.edit();
        notificationLists=new ArrayList<NotificationList>();


    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        timerStart();
        //Remove();
        return Service.START_STICKY;
    }

    public void showNotifications()
    {

        Calendar cal = Calendar.getInstance();
        Date currentLocalTime = cal.getTime();
        DateFormat date = new SimpleDateFormat("hh:mm a");
        String localTime = date.format(currentLocalTime);
        String converted = localTime.replace("am", "AM").replace("pm", "PM");
        Toast.makeText(getApplicationContext(),"Timer Running",Toast.LENGTH_LONG).show();
        Log.d("Locals",""+local);
        //Toast.makeText(getApplicationContext(),"Service Checked",Toast.LENGTH_SHORT).show();
        if(!prefs.getString("weight_hr","").equals("")) {
            if (prefs.getString("weight_hr", "").equals(converted)) {
                temp++;
                Bundle bundle=new Bundle();
                //SimpleDateFormat writeformat = new SimpleDateFormat("dd/MM/yyyy");
                //String formattedDate = writeformat.format(calendar.getTime());
                if(temp==1) {
                    notificationLists.add(new NotificationList("Weight", "It's time to log your weight today. Click to update weight!", ""));
                    Gson gson = new Gson();
                    String json = gson.toJson(notificationLists);
                    editor.putString("notificationlist", json);
                    editor.commit();
                    bundle.putString("fromNotificationCenter","1");
                }
                else
                {
                    bundle.putString("fromNotificationCenter","0");
                }
                manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
                Intent notificationIntent = new Intent(getApplicationContext(), WeightGoalActivity.class);
                notificationIntent.putExtras(bundle);
                PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 6, notificationIntent, 0);
                NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
                builder.setAutoCancel(true);
                builder.setContentTitle("Cyberhealths");
                builder.setContentText("It's time to log your weight today. Click to update weight!");
                builder.setSmallIcon(R.drawable.my_icon);
                builder.setContentIntent(pendingIntent);
                builder.setOngoing(false);
                manager.notify(6, builder.build());

            }
        }











    }





    @Override
    public void onDestroy() {
        super.onDestroy();
        timer.cancel();
        manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(6);
        Toast.makeText(getApplicationContext(),"Service Destroyed",Toast.LENGTH_LONG).show();

    }
    private void timerStart() {
        timer = new Timer();
        timerTask = new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            showNotifications();
                        } catch (Exception e) {

                        }

                    }
                });
            }
        };
        timer.scheduleAtFixedRate(timerTask, 0, 65000);

    }


   @Override
    public void onTaskRemoved(Intent rootIntent) {
        super.onTaskRemoved(rootIntent);
        Intent restartService = new Intent(getApplicationContext(),
                this.getClass());
        restartService.setPackage(getPackageName());
        PendingIntent restartServicePI = PendingIntent.getService(
                getApplicationContext(), 1, restartService,
                PendingIntent.FLAG_ONE_SHOT);
        AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
        alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePI);

    }

    private void runOnUiThread(Runnable runnable) {
        handler.post(runnable);
    }
    public class MyBinder extends Binder {
        public NotificationService getService() {
            return NotificationService.this;
        }
    }







}

1 个答案:

答案 0 :(得分:0)

来自startForeground()的文档:

  

使此服务在前台运行,提供正在进行的服务   在此状态下向用户显示通知。默认情况下   服务是后台的,这意味着如果系统需要杀死它们   回收更多内存(例如在网络中显示大页面)   浏览器),他们可以在没有太大伤害的情况下被杀死。你可以设置它   如果查杀您的服务会对用户造成破坏,例如   如果您的服务正在执行背景音乐播放,那么用户   会注意到他们的音乐是否停止播放。

showNotification()方法中,您需要在通知时启动前台服务,

int FOREGROUND_ID = 6;
....
builder.setOngoing(false);
Notification notification = builder.build();
manager.notify(FOREGROUND_ID, notification);
startForeground(FOREGROUND_ID, notification);

一旦您需要停止服务,只需致电:

stopForeground(**false / true**);

如果您不想在服务停止后删除通知,请通过false;如果您愿意,则true通知{...}}应自动删除通知。