精华内容
下载资源
问答
  • 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 通知栏点击事件及8.0适配

    千次阅读 2019-02-02 19:12:27
    设置 通知栏 private void setNotification(String filePath, String recordType) { notificationManager = (NotificationManager) mainActivity.getSystemService(Context.NOTIFICATION_SERVICE); ...

    设置 通知栏

        private void setNotification(String filePath, String recordType) {
            notificationManager = (NotificationManager) mainActivity.getSystemService(Context.NOTIFICATION_SERVICE);
    
            // ========= 重点1 ============
            NotificationChannel notificationChannel= null;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                notificationChannel = new NotificationChannel("channel_id","channel_name", NotificationManager.IMPORTANCE_HIGH);
                notificationChannel.setDescription("chanel_description");
                notificationChannel.enableVibration(true);
                notificationChannel.setVibrationPattern(new long[]{100, 200, 200, 200});
                notificationManager.createNotificationChannel(notificationChannel);
            }
    
             builder = new NotificationCompat.Builder(mainActivity, mainActivity.getPackageName());
             remoteViews = new RemoteViews(mainActivity.getPackageName(), R.layout.notification_layout);
             notification = builder
                    .setSmallIcon(R.mipmap.nl_icon)//通知的构建过程基本与默认相同
                    .setWhen(System.currentTimeMillis())
                    .setAutoCancel(false)
                    .setShowWhen(false)
                    .setLocalOnly(true)
                    .setPriority(Notification.PRIORITY_MAX)
                    .setCustomContentView(remoteViews)
                    .setVibrate(new long[]{100, 200, 200, 200})
                    .build();
            notification.flags=Notification.FLAG_ONGOING_EVENT;
            notification.flags |= Notification.FLAG_NO_CLEAR;
    
            Intent intentOne = new Intent(mainActivity, MainActivity.class);
            PendingIntent pendingIntentOne = PendingIntent.getActivity(mainActivity, 0, intentOne, PendingIntent.FLAG_UPDATE_CURRENT);
    
            Intent intent = new Intent("notification_clicked"); // ========= 重点2============
            PendingIntent pendingIntent = PendingIntent.getBroadcast(mainActivity, PENDINGINTENT_REQUEST_CODE, intent,PendingIntent.FLAG_UPDATE_CURRENT);
    
            remoteViews.setTextViewText(R.id.nl_tv_filename,filePath);
            remoteViews.setTextViewText(R.id.nl_tv_type,recordType);
            remoteViews.setOnClickPendingIntent(R.id.nl_rl_parent, pendingIntent);
            
    
            notificationManager.notify(NOTIFICATION_ID, notification);
        }

    注册动态广播

    IntentFilter intent=new IntentFilter("notification_clicked"); // ========= 重点3============
    nlBroadcastReceiver=new NLBroadcastReceiver();
    mainActivity.registerReceiver(nlBroadcastReceiver,intent);

    接收广播

       class NLBroadcastReceiver extends BroadcastReceiver{
    
           @Override
           public void onReceive(Context context, Intent intent) {
               LogTools.i(TAG,"onReceive=intent=action="+intent.getAction());
                if(intent.getAction().equals("notification_clicked")){ // ========= 重点4 ============
             
                }
           }
       }

    取消通知栏

        private void cancelNotification(){
            notificationManager = (NotificationManager) mainActivity.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.cancel(NOTIFICATION_ID);
        }

    注销广播

     mainActivity.unregisterReceiver(nlBroadcastReceiver );

     

    展开全文
  • 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

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

    展开全文
  • 先说明一下,通知栏这个功能,我一般用的很少,故不是太熟悉,今天有这个需求,前台service常驻,自义定的通知栏点击事件跳转,搞了一两个小时,设置的点击事件一直不起作用。郁闷了半天最后才发现问题。下面代码...

    先说明一下,通知栏这个功能,我一般用的很少,故不是太熟悉,今天有这个需求,前台service常驻,自义定的通知栏带点击事件跳转,搞了一两个小时,设置的点击事件一直不起作用。郁闷了半天最后才发现问题。下面代码贴出来介绍。

    // 唯一的通知通道的id , 设置的成员变量
        String notificationChannelId = "notification_channel_id_01";
        private void createNotific(){
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            //2.初始化一个notification的对象
            Notification.Builder builder = new Notification.Builder(this);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // 8.0 通知栏专属
                NotificationChannel notificationChannel = new NotificationChannel(notificationChannelId,"我的应用名称",NotificationManager.IMPORTANCE_HIGH);
                notificationManager.createNotificationChannel(notificationChannel);
                builder.setChannelId(notificationChannelId);
            }
            // 自定义通知栏样式用到RemoteViews ,第一个参数固定写法,第二个布局id
            RemoteViews remoteViews = new RemoteViews(this.getPackageName(), R.layout.service_notific_layout);
            // 设置点击事件 1  
            Intent cleatInt = new Intent(this, AAAAActivity.class);
            cleatInt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent clearIntent = PendingIntent.getActivity(this,0,cleatInt,PendingIntent.FLAG_UPDATE_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.imgToClear,clearIntent);
            // 设置点击事件 2  
            Intent speedInt = new Intent(this, BBBBActivity.class);
            speedInt.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent speedIntent = PendingIntent.getActivity(this,12,speedInt,0);
            remoteViews.setOnClickPendingIntent(R.id.imgToSpeed,speedIntent);
              //这里把布局 设置到Content中
            builder.setContent(remoteViews);
            builder.setSmallIcon(R.mipmap.ic_launcher);
            Notification notification = builder.build();
            notificationManager.notify(NOTIFICATION_ID,notification);
            // 前台服务方式 必备
            startForeground(NOTIFICATION_ID,notification);
    
        }

    重要--重要--重要

    看到上面代码了吧,有一个顺序问题,就是通知PendingIntent 设置的点击跳转,一定要放在          

    //这里把布局 设置到Content中
    builder.setContent(remoteViews);

    这句代码前面

    否则点击事件不起任何作用。

     

    展开全文
  • android DownloadManager广播事件:下载完成、通知栏点击事件android中自带的下载器DownloadManager很好用,一般的需求都是可以满足的,至于怎么使用,暂不介绍,因为网上搜一下大把,就不浪费口水了。而我这里要...
  • Android监听消息通知栏点击事件

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

    千次阅读 2019-05-08 10:34:23
    传统的PendingIntent只能跳转到一个页面,这样会有一个bug,就是假如你本来在activity1,然后点击通知跳转到activity1,界面会重新加载而且点击返回键会返回上一个没有修改的activity1,假如这个activity已经被修改...
  • 核心思想: 使用BroadCastReceiver 1 新建一个BroadCastReceiver类,并且在清单文件中...! ... android:name=".NotificationClickReceiver"> </receiver> public class NotificationClickReceiver ...
  • Android通知栏微技巧,8.0系统中通知栏的适配

    万次阅读 多人点赞 2018-04-17 07:39:11
    大家好,今天我们继续来学习Android 8.0系统的适配。...在上一篇文章当中,我们学习了Android 8.0系统应用图标的适配,那么本篇文章,我们自然要将重点放在通知栏上面了,学习一下Android 8.0系统的通知栏适配
  • Android 通知栏点击取消

    千次阅读 2015-11-12 14:54:46
    看了很多文章写了怎么取消通知栏的,自己试了就是取消不掉。后来尝试之后实现了,代码写错了。 public class LoginSuccess extends Activity { @Override protected void onCreate(Bundle ...
  • Android 通知栏点击

    千次阅读 2018-08-02 16:30:32
    这里介绍如何点击通知后,跳转到指定activity,包含多个activity。   app结构:有3个activity,执行顺序是a-&gt;b-&gt;c,a是主界面。 需求:点击通知,直接打开activity c,按返回键打开b。   这里...
  • Notification的三要素 1.小图标 .setSmallIcon() ...这是一个通知栏的 三要素 有了三要素你的通知栏才能显示出来 一些常用的方法 方法 效果 .setSmallIcon() 小图标 .setContentTitle() 标题 .s...
  • Android通知栏点击通知消失

    千次阅读 2015-12-16 16:08:55
    private void showNotification() {  int icon = R.drawable.ic_launcher; //通知图标  CharSequence ... //状态(Status Bar)显示的通知文本提示  long when = System.currentTimeMillis(); //通知产生
  • android通知栏响应事件

    千次阅读 2013-07-09 19:19:46
    //在这里处理点击事件   }   };   IntentFilter filter =  new   IntentFilter();   filter.addAction(STATUS_BAR_COVER_CLICK_ACTION);   registerReceiver...
  • 最近在使用通知栏通知用户,用户点击通知栏后跳转到相应的界面.但是发现一个问题,在某些机型比如三星note2,OPPO find7上无法启动.但是在其他手机上正常.通知栏的代码如下:public static void ...
  • 通过点击通知栏发送广播有个坑:动态注册广播无法触发点击事件,其实是可以解决的。 代码示例: //AndroidManifest清单文件配置 <receiver android:name=".MyReceiver"/> //点击事件接收的广播 public class ...
  • Android 通知栏

    2017-01-18 13:45:41
    requestCode,我设置的值:0,由于我创建的三个通知,requestCode值相同,并且第四个参数PendingIntent.FLAG_UPDATE_CURRENT,导致后创建的通知会更新之前的通知的perIntent参数,因此每次点击通知后,获取到的参数...
  • Android如何实现通知栏点击事件:我想通过点击通知栏中的一栏显示一个对话框? 我知道可以跳转到一个Activity,但是找不到一个显示对话框的方法,我是菜鸟,求高手指导!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,851
精华内容 9,940
关键字:

android通知栏点击事件