簡體   English   中英

使用Alarm Manager Android安排本地通知

[英]Scheduling local notifications using Alarm Manager 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;
        }
    }







}

startForeground()的文檔中:

使此服務在前台運行,並在此狀態下向用戶顯示正在進行的通知。 默認情況下,服務是后台的,這意味着如果系統需要殺死它們以回收更多的內存(例如在Web瀏覽器中顯示大頁面),則可以殺死它們而不會造成太大的傷害。 如果取消服務會對用戶造成破壞(例如服務正在執行背景音樂播放),則可以設置此標志,以便用戶注意其音樂是否停止播放。

showNotification()方法中,您需要在Notification時在前台啟動服務,

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 ,如果你想要的通知應被自動刪除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM