精华内容
下载资源
问答
  • Android通知栏点击事件

    万次阅读 2017-07-21 02:24:55
    最近在做一个混合开发项目,给本地通知栏发送消息,并且在点击...获取通知栏点击事件3.通过cordova调用js一、首先是给本地通知栏发送消息,此部分比较简单,直接上代码。public void createNotification(Context ctx,

      最近在做一个混合开发项目,给本地通知栏发送消息,并且在点击通知栏时不去跳转到某一activity界面,而是通过cordova调用js事件。

    大致可将这个问题分成三个部分来解决:

    1.给本地通知栏发送消息
    2.获取通知栏点击事件
    3.通过cordova调用js

    一、首先是给本地通知栏发送消息,此部分比较简单,直接上代码。

    public void createNotification(Context ctx, PendingIntent intent, int id) {
    
        NotificationManager nm =  (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = null;
        //有两种方式来创建notification
        //一
        notification = new Notification(icon, title, id);
        notification.setLatestEventInfo(ctx, title, content,intent);
        //二
        Notification.Builder builder = new Notification.Builder(ctx);
        builder.setContentText("title"); // 下拉通知栏内容
        builder.setContentTitle("content");// 下拉通知栏标题
        builder.setSmallIcon(icon);//通知栏图标
        builder.setAutoCancel(true);
        builder.setContentIntent(intent);
        notification = builder.build();
        nm.notify(id, notification);
    }

    二、获取通知栏的点击事件,这里是本文的重点。

    上面的代码大家应该能注意到,notification创建时需要传入一个PendingIntent类型的参数,这个参数就是用来处理点击通知之后的动作。与一般intent不同,PendingIntent是指在某条件适当的时机执行的动作,而不是立即执行。

    PendingIntent当中有一个方法getBroadcast(),可以向外发出广播,因此我们可以借助该方法,在点击通知栏时发出广播并在onreceiver方法中处理相应逻辑

    class MyReceiver extends BroadcastReceiver{
        public void onReceive(Context context, Intent intent) {
            //处理相应逻辑
        }
    }
    
    public void buildAction(Context ctx,Intent intent) {
    
        int id = (int)System.currentTimeMillis() / 10000;
        //这个getbroadcast方法和创建notifycation时都会用到一个id标示,一般都是统一的,但是我用不同值试过也是可以的
    
        PendingIntent clickIntent = PendingIntent.getBroadcast(ctx, id,intent, PendingIntent.FLAG_UPDATE_CURRENT);
        createNotification(ctx,clickIntent,id);
    
    }

    接下来就是将广播放入PendingIntent当中了,同时还要注册广播,最开始我的写法时参照网上的写法:

    IntentFilter filter = new IntentFilter();
    filter.addAction(MY_ACTION);
    args.getUMActivity().registerReceiver(new MyReceiver(), filter);
    
    Intent intent = new Intent(ctx, MyReceiver.class);
    intent.setAction(MY_ACTION);

    发现这样写无法触发广播,只能静态注册,网上查了半天也没有结果。后来一想既然调用了setAction方法注册了动作,并且有了intentfilter,为什么还要写一个new Intent(ctx,MyReceiver.class);这不是画蛇添足吗,之后改成如下方式:

    public void run() {
        IntentFilter filter = new IntentFilter(MY_ACTION);
    
        args.getUMActivity().registerReceiver(new UMNotificationClickReceiver(), filter);
    
        Intent intent = new Intent(MY_ACTION);
        buildAction(this,intent);
    }

    一运行,哈哈,OK

    第三部分用cordova调用js就不细说了,与本文无关,有兴趣的同学可以去网上学习一下混合开发!

    展开全文
  • android常驻通知栏点击事件

    千次阅读 2020-06-29 10:52:48
    * 说明:通知栏点击事件 * 作者:耿保龙 * 添加时间:2020/6/28 17:11 * 修改人:耿保龙 * 修改时间:2020/6/28 17:11 */ private fun getNotificationPendingIntent(context: Context): P.

     android实现了常驻通知栏的显示后,需要处理点击事件。点击后进入首页。

    1、发现无法收到广播

    1)静态注册

    2)点击响应代码如下

       /**
         * 说明:通知栏点击事件
         */
        private fun getNotificationPendingIntent(context: Context): PendingIntent? {
            val intent = Intent(BroadcastConfig.ACTION_OPEN_APP_NOTIFICATION)
            return PendingIntent.getBroadcast(context, mNotificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT)
        }

     

    此时,无论如何都收不到广播。

    通常,有两种方式构造自定义广播

    a:      

    val intent = Intent(BroadcastConfig.ACTION_OPEN_APP_NOTIFICATION)

    b:      

    val intent = Intent(context, NotificationReceiver::class.java)
    intent.action = BroadcastConfig.ACTION_OPEN_APP_NOTIFICATION

    总结:

    如果广播是动态注册,用第一种(action的方式)可以响应通知栏点击事件,用第二种(class的方式)构造函数生成Intent,就无法响应。
    
    如果广播是静态注册,第二种方式才可以响应。

    因为我使用了静态注册,而构造自定义广播时使用的是action方式,所以会收不到广播。

    解决:

    还是使用静态注册,但是构造方式改为

        private fun getNotificationPendingIntent(context: Context): PendingIntent? {
            val intent = Intent(context, NotificationReceiver::class.java)
            intent.action = BroadcastConfig.ACTION_OPEN_APP_NOTIFICATION
            return PendingIntent.getBroadcast(context, mNotificationId, intent, PendingIntent.FLAG_CANCEL_CURRENT)
        }

    至此,无法收到点击通知广播的问题解决!!!

     

    2、收到广播后跳转报错

    2020-06-29 10:25:42.399 6617-6617/xxx E/AndroidRuntime: FATAL EXCEPTION: main
        Process: xxx, PID: 6617
        java.lang.RuntimeException: Unable to start receiver com.xxx.module.notification.NotificationReceiver: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
            at android.app.ActivityThread.handleReceiver(ActivityThread.java:3460)
            at android.app.ActivityThread.access$1300(ActivityThread.java:202)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1691)
            at android.os.Handler.dispatchMessage(Handler.java:106)
            at android.os.Looper.loop(Looper.java:207)
            at android.app.ActivityThread.main(ActivityThread.java:6878)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876)
         Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
            at android.app.ContextImpl.startActivity(ContextImpl.java:922)
            at android.app.ContextImpl.startActivity(ContextImpl.java:898)
            at android.content.ContextWrapper.startActivity(ContextWrapper.java:389)
            at android.content.ContextWrapper.startActivity(ContextWrapper.java:389)
            at com.xxx.home.HomePageActivity$Companion.startActivity(HomePageActivity.kt:50)
            at com.xxx.module.notification.NotificationReceiver.dealWithResidentNotificationClick(NotificationReceiver.kt:36)
            at com.xxx.module.notification.NotificationReceiver.onReceive(NotificationReceiver.kt:18)
            at android.app.ActivityThread.handleReceiver(ActivityThread.java:3451)
            at android.app.ActivityThread.access$1300(ActivityThread.java:202) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1691) 
            at android.os.Handler.dispatchMessage(Handler.java:106) 
            at android.os.Looper.loop(Looper.java:207) 
            at android.app.ActivityThread.main(ActivityThread.java:6878) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:876) 

    提示的很明显了,在Activity类型context之外调用startActivity,需要添加flag------

    Intent.FLAG_ACTIVITY_NEW_TASK

    至此,点击常驻通知栏可以正常跳转!!!

    展开全文
  • Android监听消息通知栏点击事件

    千次阅读 2019-12-02 16:47:54
    Android监听消息通知栏点击事件 使用BroadCastReceiver 1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!! public class NotificationClickReceiver extends BroadcastReceiver { @Override ...

    Android监听消息通知栏点击事件

    使用BroadCastReceiver

    1 新建一个NotificationClickReceiver 类,并且在清单文件中注册!!

    public class NotificationClickReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            //todo 跳转之前要处理的逻辑
            Log.i("TAG", "userClick:我被点击啦!!! ");
            Intent newIntent = new Intent(context, Main2Activity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(newIntent);
        }
    }
    

    在清单文件中注册

     <receiver
             android:name=".NotificationClickReceiver">
     </receiver>
    

    在你需要创建通知栏的地方

    NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
            Notification.Builder builder1 = new Notification.Builder(MainActivity.this);
            builder1.setSmallIcon(R.drawable.ic_launcher); //设置图标
            builder1.setTicker("显示第二个通知");
            builder1.setContentTitle("通知"); //设置标题
            builder1.setContentText("点击查看详细内容"); //消息内容
            builder1.setWhen(System.currentTimeMillis()); //发送时间
            builder1.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音,振动方式,灯光
            builder1.setAutoCancel(true);//打开程序后图标消失
            Intent intent =new Intent (MainActivity.this,NotificationClickReceiver.class);
            PendingIntent pendingIntent =PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
            builder1.setContentIntent(pendingIntent);
            Notification notification1 = builder1.build();
            notificationManager.notify(124, notification1); // 通过通知管理器发送通知
    

    如果需要携带什么参数就在这里的intent包裹即可,NotificationClickReceiver可以接收到发送过来的intent

    兼容Android 8及以上

    // 版本升级通知框
                    NotificationManager notificationManager = (NotificationManager) MapActivity.this.getSystemService(Context.NOTIFICATION_SERVICE);
                    Notification.Builder builder1 = new Notification.Builder(MapActivity.this);
                    // 通知框兼容 android 8 及以上
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        NotificationChannel channel = new NotificationChannel("11212313131", "NotificationName", NotificationManager.IMPORTANCE_DEFAULT);
                        channel.enableLights(true);
                        channel.setShowBadge(true);
                        notificationManager.createNotificationChannel(channel);
                        builder1.setChannelId("123456");
                    }
                    builder1.setSmallIcon(R.mipmap.touxiang); //设置图标
                    builder1.setContentTitle("这是一个通知"); //设置标题
                    builder1.setContentText("这是消息内容"); //消息内容
                    builder1.setWhen(System.currentTimeMillis()); //发送时间
                    builder1.setDefaults(Notification.DEFAULT_ALL); //设置默认的提示音,振动方式,灯光
                    builder1.setAutoCancel(true);//打开程序后图标消失
                    Intent intent = new Intent(Activity.this, NotificationClickReceiver.class);
                    intent.putExtra("url","www.baidu.com");
                    PendingIntent pendingIntent = PendingIntent.getBroadcast(Activity.this, 0, intent, 0);
                    builder1.setContentIntent(pendingIntent);
                    Notification notification1 = builder1.build();
                    notificationManager.notify(124, notification1); // 通过通知管理器发送通知
    
    public class NotificationClickReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            String url = intent.getStringExtra("url");
            Uri uri = Uri.parse(url);
            Intent i = new Intent(Intent.ACTION_VIEW, uri);
            context.startActivity(i);
        }
    }
    
    展开全文
  • 电脑底部的通知栏点击没反应

    千次阅读 2019-10-31 22:09:28
    电脑底部的通知栏点击没反应 自从电脑自动更新过系统过后,点击电脑底部通知栏就没有反应了(点Wi-Fi,音量这些不会弹出来)。点击电脑自带的浏览器,邮箱还提示:没有注册类。win10的系统 ...

    电脑底部的通知栏点击没反应


    自从电脑自动更新过系统过后,点击电脑底部通知栏就没有反应了(点Wi-Fi,音量这些不会弹出来)。点击电脑自带的浏览器,邮箱还提示:没有注册类。win10的系统

    展开全文
  • android 8.0 需要增加是适配,主要是应用图标和通知栏通知栏,主要就是增加了 渠道这个概念,就是一个APP中不同的通知类型要进行分类了,并且用户可以自主选择每一种通知渠道的权限和重要程度。哎,穷逼还没有8.0...
  • 先说明一下,通知栏这个功能,我一般用的很少,故不是太熟悉,今天有这个需求,前台service常驻,自义定的通知栏点击事件跳转,搞了一两个小时,设置的点击事件一直不起作用。郁闷了半天最后才发现问题。下面代码...
  • Android 通知栏点击

    千次阅读 2018-08-02 16:30:32
    这里介绍如何点击通知后,跳转到指定activity,包含多个activity。   app结构:有3个activity,执行顺序是a-&gt;b-&gt;c,a是主界面。 需求:点击通知,直接打开activity c,按返回键打开b。   这里...
  • Android通知栏点击通知消失

    千次阅读 2015-12-16 16:08:55
    private void showNotification() {  int icon = R.drawable.ic_launcher; //通知图标  CharSequence ... //状态(Status Bar)显示的通知文本提示  long when = System.currentTimeMillis(); //通知产生
  • 关于通知栏Notification的使用,不多讲,这里说的很清楚...在应用关闭的时候,发送通知到通知栏点击通知栏能正常跳转到我想要的页面,代码如下 Intent msgIntent = new Intent(); msgIntent.addCate...
  • android定义通知栏点击事件

    千次阅读 2019-05-08 10:34:23
    传统的PendingIntent只能跳转到一个页面,这样会有一个bug,就是假如你本来在activity1,然后点击通知跳转到activity1,界面会重新加载而且点击返回键会返回上一个没有修改的activity1,假如这个activity已经被修改...
  • 通知栏点击后消失怎么使通知栏点击后消失啊?以下为我的代码,能实现将信息放入通知栏,但是点击后不消除。。。privatevoidshowNotification(Stringtemp){//创建一个NotificationManager的引用NotificationManager...
  • Android 通知栏点击取消

    千次阅读 2015-11-12 14:54:46
    看了很多文章写了怎么取消通知栏的,自己试了就是取消不掉。后来尝试之后实现了,代码写错了。 public class LoginSuccess extends Activity { @Override protected void onCreate(Bundle ...
  • android DownloadManager广播事件:下载完成、通知栏点击事件:android中自带的下载器DownloadManager很好用,一般的需求都是可以满足的,至于怎么使用,暂不介绍,因为网上搜一下大把,就不浪费口水了。而我这里要...
  • } } 2 在你需要创建通知栏的地方 NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); Notification.Builder builder1 = new Notification....
  • 通知栏点击事件

    2014-07-09 11:30:39
    通知栏点击的事件或者监听是怎么执行的?有没有具体的方法或者监听器什么的? 小弟想做一个功能是在点击通知栏的消息后打开手机中的某个文件,怎么实现呢? 一下是小弟自己的代码,还有个问题是怎么设置成点击了...
  • android 通知栏点击事件及8.0适配

    千次阅读 2019-02-02 19:12:27
    设置 通知栏 private void setNotification(String filePath, String recordType) { notificationManager = (NotificationManager) mainActivity.getSystemService(Context.NOTIFICATION_SERVICE); ...
  • 最近在使用通知栏通知用户,用户点击通知栏后跳转到相应的界面.但是发现一个问题,在某些机型比如三星note2,OPPO find7上无法启动.但是在其他手机上正常. 通知栏的代码如下: public static void showStartActivit
  • 想实现酷我那样的通知栏,效果如下:之前也是使用Notification实现的通知栏,这里讲一下实现方式以及遇到的问题。Androidapidemo中有Notification的实例,里面讲述了Notification的各种使用方法,当然也包括自定义...
  • IOS 通知栏点击跳转指定页面

    千次阅读 2016-11-11 14:36:50
    //如果程序没有运行,点击通知栏推送消息跳转到指定页面。 if (launchOptions) {    NSUserDefaults *pushJudge = [NSUserDefaults standardUserDefaults];  [pushJudge setObject:@"push" for

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,052
精华内容 820
关键字:

通知栏点击