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 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);
        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>
时间: 2024-10-31 13:40:49

android本地定时通知的相关文章

Unity3D研究院之IOS本地消息通知LocalNotification的使用

原地址:http://www.xuanyusong.com/archives/2632   现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送,客户端就可以完成.Unity里面提供了本地任务的功能但是只有IOS上才支持,开始我有点不解为什么Android上不支持,当我把Android的本地通知做完后,我才明白.IOS源生的API中就支持固定时间循环推送,而Android上需要自己开启一个Services,启动一个AlarmManag

cordova-plugin-local-notifications发送Android本地消息

原文:cordova-plugin-local-notifications发送Android本地消息 1.GitHub源代码地址: https://github.com/katzer/cordova-plugin-local-notifications 2.参数说明: https://github.com/katzer/cordova-plugin-local-notifications/wiki/04.-Scheduling 3.事件说明: https://github.com/katzer/

Android学习--使用通知

通知 安卓和苹果一样,在App进去后台之后,当你需要给客户发送一些消息提醒之类的东西就得使用到通知这个东西,安卓中的通知显然是要比苹果的简单一点,苹果的在通知这方面主要展示在远程推送和本地通知上面,这里我们就简单的说说安卓的本地的通知的以及基本的展示,远程推送的东西在后面涉及到的时候再做总结,先看看下面这个的一个运行效果图,这是我在自己的安卓测试机上看到的效果,其他的就没什么说的,代码中需要注意的东西在代码注释记录的很清楚,就直接上代码: 通知 // 这里注意一下PendingIntent和In

android本地保存Cookie和还原到cookiestore

保存cookie,读取cookie以及判断cookie是否存在 ```java public class Local { private static SharedPreferences shared; public static void setShared(SharedPreferences shared) { Local.shared = shared; } public static void saveStrCookie(String cookie) { SharedPreference

Android本地JUnit Text

Android本地JUnit Text 步骤 创建一个和source文件,里面添加和src目录相同的包. 在AndroidManifest.xml文件manifest根节点添加如下文件 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.zlpro.mobilesafe" > </instrumentati

Android Wear - 归档通知(Stacking Notifications)

原文地址:http://developer.android.com/wear/notifications/stacks.html 前言 当在手持设备上创建通知的时候,你应该经常将一些类似的通知归并到一个单一的摘要通知中.比如,如果你的应用接收到信息后会创建通知,你不应该在手持设备上创建多条通知.当接收到多条信息的时候,你应该使用一条单一的通知并显示类似"2 new messages"这样的摘要信息. 但是,一个摘要通知在Android Wear设备上就显得没那么有用,因为用户不能够在穿

【Android】状态栏通知Notification、NotificationManager详解(转)

在Android系统中,发一个状态栏通知还是很方便的.下面我们就来看一下,怎么发送状态栏通知,状态栏通知又有哪些参数可以设置? 首先,发送一个状态栏通知必须用到两个类:  NotificationManager . Notification. NotificationManager :  是状态栏通知的管理类,负责发通知.清楚通知等. NotificationManager 是一个系统Service,必须通过 getSystemService()方法来获取. [java] view plainc

android ioctl fuzz,android 本地提权漏洞 android root

目前正在研究android 三方设备驱动 fuzzer , 也就是下图所说的 ioctl fuzzing, 下图是由keen team nforest 大神发布: 欢迎正在研究此方面的人联系我共同交流进步!Email:  Blind Fuzz Smart Fuzz android 内核栈溢出android slab/slub 类堆溢出android 数组越界导致的复写内核中的重要数据android 内核信息泄漏android null pointer deference 空指针引用android

Android 本地/网路下载图片实现放大缩小

 Android 本地加载/网路下载图片实现放大缩小拖拉效果,自定义控件. package com.example.ImageViewCustom; import android.app.Activity; import android.os.Bundle; import com.example.ImageViewCustom.CustomControl.MImageView; public class MyActivity extends Activity { MImageView mImag