android-Notification点击跳转Activity

> 在日历应用中,你新建一个提醒,当提醒通知收到后,你点击通知,会进入提醒的内容页面,如果这个时候按back键,会直接退出应用。

但是在Gmail的应用中,如果有一封新邮件到来,那么点击通知后,会进入到邮件的内容页面,等你看完邮件,点击back键,会退到邮件列表页面,再按back键,才会退出应用。

> 我们总结一下两种情况,假设我们的应用有两个Activity(ParentActivity、SubActivity),notification中设置打开的Activity为SubActivity。

那么第一种情况就是:

点击Notification ——>进入SubActivity ——> back键 ——> 退出应用

第二种情况:

点击Notification ——>进入SubActivity ——> back键 ——> 退到ParentActivity ——>back键 ——>退出应用

 

> 实现

第一种情况比较简单,只需要在PendingIntent中指定Activity,不需要其他设置,Android默认的就这样。

Java代码   收藏代码
  1. PendingIntent contentIntent = PendingIntent.getActivity(context, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT);  

但是在创建PendingIntent的时候需要注意参数PendingIntent.FLAG_CANCEL_CURRENT

这个标志位用来指示:如果当前的Activity和PendingIntent中设置的intent一样,那么久先取消当前的Activity,用PendingIntent中指定的Activity取代之。

另外,需要在Manifest中对指定的Activity设置属性

Java代码   收藏代码
  1. <activity android:name=".SubActivityl"  
  2.         android:launchMode="singleTask"  
  3.         android:taskAffinity=""  
  4.         android:excludeFromRecents="true">  
  5. </activity>  

第二种情况稍微复杂点,因为如果只打开一个SubActivity,程序并没办法知道他的上一级Activity是谁,所以需要在点击Notification时打开一组Activity,但是我们并不需要一个个去调用startActivity方法,PendingIntent提供了个静态方法getActivities,里面可以设置一个Intent数组,用来指定一系列的Activity。

所以我们首先写一个函数创建一个Activity数组:

Java代码   收藏代码
  1. Intent[] makeIntentStack(Context context) {  
  2.     Intent[] intents = new Intent[2];  
  3.     intents[0] = Intent.makeRestartActivityTask(new ComponentName(context, com.example.notificationtest.MainActivity.class));  
  4.     intents[1] = new Intent(context,  com.example.notificationtest.SubActivity.class);  
  5.     return intents;  
  6. }  

 其中需要注意的是Intent.makeRestartActivityTask方法,这个方法用来创建activity栈的根activity

接下来,创建并显示Notification:

Java代码   收藏代码
  1. void showNotification(Intent intent) {  
  2.     Notification notification = new Notification(  
  3.             R.drawable.status_icon,   
  4.             "Hello World ticker text",  
  5.             System.currentTimeMillis());  
  6.   
  7.     PendingIntent contentIntent = PendingIntent.getActivities(  
  8.             this,  
  9.             0,  
  10.             makeIntentStack(this),   
  11.             PendingIntent.FLAG_CANCEL_CURRENT);  
  12.     notification.setLatestEventInfo(  
  13.             this,   
  14.             "Title",  
  15.             "Hey, shall we have a dinner tonight",   
  16.             contentIntent);  
  17.     notification.flags |= Notification.DEFAULT_ALL;  
  18.   
  19.     mNM.notify(1, notification);  
  20. }  

》加入其它效果:
// 创建一个NotificationManager的引用  
         NotificationManager notificationManager = (NotificationManager)   
            this.getSystemService(android.content.Context.NOTIFICATION_SERVICE);  
          
        // 定义Notification的各种属性  
        Notification notification =new Notification(R.drawable.icon,  
                "测试", System.currentTimeMillis());
        //FLAG_AUTO_CANCEL   该通知能被状态栏的清除按钮给清除掉
        //FLAG_NO_CLEAR      该通知不能被状态栏的清除按钮给清除掉
        //FLAG_ONGOING_EVENT 通知放置在正在运行
        //FLAG_INSISTENT     是否一直进行,比如音乐一直播放,知道用户响应
        notification.flags |= Notification.FLAG_ONGOING_EVENT; 
// 将此通知放到通知栏的"Ongoing"即"正在运行"组中  
        notification.flags |= Notification.FLAG_NO_CLEAR; 
// 表明在点击了通知栏中的"清除通知"后,此通知不清除,经常与FLAG_ONGOING_EVENT一起使用  
        notification.flags |= Notification.FLAG_SHOW_LIGHTS;  
        //DEFAULT_ALL     使用所有默认值,比如声音,震动,闪屏等等
        //DEFAULT_LIGHTS  使用默认闪光提示
        //DEFAULT_SOUNDS  使用默认提示声音
        //DEFAULT_VIBRATE 使用默认手机震动,需加上<uses-permission android:name="android.permission.VIBRATE" />权限
        notification.defaults = Notification.DEFAULT_LIGHTS;
        //叠加效果常量
        //notification.defaults=Notification.DEFAULT_LIGHTS|Notification.DEFAULT_SOUND;
        notification.ledARGB = Color.BLUE;  
        notification.ledOnMS =5000; //闪光时间,毫秒
          
        // 设置通知的事件消息  
        CharSequence contentTitle ="标题"; // 通知栏标题  
        CharSequence contentText ="内容"; // 通知栏内容  

//如果需要跳转到指定的Activity,则需要设置PendingIntent

        Intent notificationIntent =new Intent(A.this, B.class); 
// 点击该通知后要跳转的Activity  
notificationIntent.putExtra("date","需要传递的参数");

// FLAG_UPDATE_CURRENT 更新数据,如果有多个PendingIntent,且requestCode相同,则会替换为最新extra数据
//如果需要通过不同的extra数据,进行处理,就需要requestCode不相同
             int requestCode = new Random().nextInt();
        PendingIntent contentItent = PendingIntent.getActivity(thisrequestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);  
        notification.setLatestEventInfo(this, contentTitle, contentText, contentItent);  
        
// 把Notification传递给NotificationManager  
        notificationManager.notify(0, notification);
不管是在什么时候按Home,再次从程序列表启动时,总能返回到Task的栈顶Activity。
一般情况下,所有Activity都在同一个Task中。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值