美文网首页
android Notification 点击事情无响应的注意事

android Notification 点击事情无响应的注意事

作者: buchuqi2677 | 来源:发表于2017-03-27 15:41 被阅读0次

我们总结一下两种情况,假设我们的应用有两个Activity(ParentActivity、SubActivity),notification中设置打开的Activity为SubActivity。
第一种情况就是:
点击Notification ——>进入SubActivity ——> back键 ——> 退出应用
第二种情况:
点击Notification ——>进入SubActivity ——> back键 ——> 退到ParentActivity ——>back键 ——>退出应用

第一种情况

PendingIntent contentIntent = PendingIntent.getActivity(context, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT);  

***注意最后一个参数***
FLAG_CANCEL_CURRENT:如果构建的PendingIntent已经存在,则取消前一个,重新构建一个。(PendingIntent contentIntent = PendingIntent.getActivity(context, 0,  intent, PendingIntent.FLAG_CANCEL_CURRENT); 第二个参数是0 )
 
FLAG_NO_CREATE:如果前一个PendingIntent已经不存在了,将不再构建它。

FLAG_ONE_SHOT:表明这里构建的PendingIntent只能使用一次。

FLAG_UPDATE_CURRENT:如果构建的PendingIntent已经存在,那么 系统将不会重复创建,只是把之前不同的传值替换掉。(所以这里如果值不变 是不是有变化的 以致于会出现一些问题 通常做法就是在构建PendingIntent的时候传入不一样的requestCode来改变 更新PendingIntent 一般都是用这个;PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt() ,  intent, PendingIntent.FLAG_CANCEL_CURRENT); 第二个参数是随机数 )

***activity要实现单例模式***

 android:launchMode="singleTask"

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

Intent[] makeIntentStack(Context context) {  
    Intent[] intents = new Intent[2];  
    intents[0] = Intent.makeRestartActivityTask(new ComponentName(context, com.example.notificationtest.MainActivity.class));  
    intents[1] = new Intent(context,  com.example.notificationtest.SubActivity.class);  
    return intents;  
}  

其中需要注意的是Intent.makeRestartActivityTask方法,这个方法用来创建activity栈的根activity
接下来,创建并显示Notification:

void showNotification(Intent intent) {  
    Notification notification = new Notification(  
            R.drawable.status_icon,   
            "Hello World ticker text",  
            System.currentTimeMillis());  
  
    PendingIntent contentIntent = PendingIntent.getActivities(  
            this,  
            0,  
            makeIntentStack(this),   
            PendingIntent.FLAG_CANCEL_CURRENT);  
    notification.setLatestEventInfo(  
            this,   
            "Title",  
            "Hey, shall we have a dinner tonight",   
            contentIntent);  
    notification.flags |= Notification.DEFAULT_ALL;  
  
    mNM.notify(1, notification);  
}  

完整实例:

        // 创建一个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(this, requestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        notification.setLatestEventInfo(this, contentTitle, contentText, contentItent);

       // 把Notification传递给NotificationManager     
        notificationManager.notify(0, notification);

相关文章

网友评论

      本文标题:android Notification 点击事情无响应的注意事

      本文链接:https://www.haomeiwen.com/subject/therottx.html