android本地定时通知

android本地通知略有不同,分为立即触发和延时触发

1.即时通知

android默认的Notification为立即触发

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClass(_gameActivity, _gameActivity.getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
PendingIntent content = PendingIntent.getActivity(context, 0, intent, 0);
final NotificationManager notiMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
final Notification noti = new Notification(R.drawable.icon, notiResult.getPayload(), System.currentTimeMillis());
String app_name = _gameActivity.getResources().getString(R.string.app_name);
noti.setLatestEventInfo(context, app_name, notiResult.getPayload(), content);

notiMgr.notify(atomicInteger.incrementAndGet(), noti);

 

2.延时触发

想让一定时间后再触发通知,其实是用系统的AlarmManager来实现的。

具体的AlarmManager解释参考

http://yuanzhifei89.iteye.com/blog/1131523

http://blog.csdn.net/ryantang03/article/details/9317499

添加一个ALARM_SERVICE

/*
* name:通知名字,作为通知id使用
* content:通知内容
* time:倒时时(秒)
* */
public static void addLocalNotication(String name, String content, int time)
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.add(Calendar.SECOND, (int) time);

Activity activity = _gameActivity;
Intent intent = new Intent(activity, NotificationReceiver.class);
intent.setClass(activity, NotificationReceiver.class);
intent.setData(Uri.parse(name));
intent.putExtra("msg", "play_hskay");

intent.putExtra("content", content);
PendingIntent pi = PendingIntent.getBroadcast(activity, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager am = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pi);
}

 

添加一个系统通知类,用于在倒计时间到时,接收系统轮询通知

import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class NotificationReceiver extends BroadcastReceiver {
    public NotificationReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent itent) {
//Toast.makeText(context, "闹铃响了, 可以做点事情了~~", Toast.LENGTH_LONG).show();
        String msg = itent.getStringExtra("msg");
        String content = itent.getStringExtra("content");
        //判断应用是否在前台运行
        if (isTopActivity(context)) {
            return;
        }
//推送一条通知
        shownotification(context, content);
        return;
    }

    public void shownotification(Context context, String msg) {
        NotificationManager barmanager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notice = new Notification(R.drawable.icon, msg, System.currentTimeMillis());
        notice.flags = Notification.FLAG_AUTO_CANCEL;

        Intent appIntent = new Intent(Intent.ACTION_MAIN);
        appIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        appIntent.setComponent(new ComponentName(context.getPackageName(), context.getPackageName() + "." + "Splash"));
//设置启动模式
        appIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
                appIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        String app_name = context.getResources().getString(R.string.app_name);
        notice.setLatestEventInfo(context, app_name, msg, contentIntent);
        AtomicInteger atomicInteger = new AtomicInteger(1);
        barmanager.notify(0, notice);
    }

    protected static boolean isTopActivity(Context activity) {
        String packageName = activity.getPackageName();
        ActivityManager activityManager = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> tasksInfo = activityManager.getRunningTasks(1);
        if (tasksInfo.size() > 0) {
            Log.d("test", "---------------包名-----------" + tasksInfo.get(0).topActivity.getPackageName());
//应用程序位于堆栈的顶层
            if (packageName.equals(tasksInfo.get(0).topActivity.getPackageName())) {
                return true;
            }
        }
        return false;
    }

}

配置文件中添加

<receiver android:name=".NotificationReceiver"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="play_hskay" />
    </intent-filter>
</receiver>

 

发表评论