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 java.util.List; import java.util.concurrent.atomic.AtomicInteger; import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; 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.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.ResolveInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.util.Log; import android.widget.Toast; 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); ListtasksInfo = 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>