Android切换前后台点击通知进入当前页面怎么实现(android,开发技术)

时间:2024-04-29 18:57:58 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

首先,先展示效果,有图才有真相

Android切换前后台点击通知进入当前页面怎么实现

效果如上图,当我们按下back键或者HOME键的时候.程序退到后台,弹出通知,点开通知回到当前页面. 在上节中,我有讲述到判断程序退到后台的两种方式. 第一种方式:在BaseActivity中onPause方法中判断程序退出后台之后,进入广播页面:

publicclassBaseActivityextendsAppCompatActivity{privatestaticfinalStringTAG="BaseActivity";@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState){super.onCreate(savedInstanceState);AppManager.getInstance().addActivity(this);}@OverrideprotectedvoidonPause(){super.onPause();if(!isAppOnForeground()){Toast.makeText(getApplicationContext(),TAG+"onPause:",Toast.LENGTH_SHORT).show();}else{Log.e(TAG,"onPause:"+"弹出通知");//第一种方式退到后台Intent_intent=newIntent(DemoBroadcastReceiver.ACTION_NOTIFY_MESSAGE);_intent.setClass(getApplicationContext(),DemoBroadcastReceiver.class);sendBroadcast(_intent);}}

第二种方式,在Application中中onStopActivity方法中判断程序退出后台之后,进入广播页面:

@OverridepublicvoidonActivityStopped(Activityactivity){countActivity--;L.i("onActivityStopped","countActivity="+countActivity);if(countActivity<=0){if(WDRTCSysConfig.getInstance().isCalling()){Intent_intent=newIntent(WDBroadcastReceiver.ACTION_ENABLE_MESSAGES);_intent.setClass(getApplicationContext(),WDBroadcastReceiver.class);sendBroadcast(_intent);}}}

不管是方法一或者 方法 二:都是进入广播服务中,进行判断然后弹出Notification通知出来.主要代码如下:

@OverridepublicvoidonReceive(Contextcontext,Intentintent){switch(intent.getAction()){caseACTION_NOTIFY_MESSAGE:Stringname=null;Stringavatar=null;//方法一:从系统的Stack中拿到当前的Activity/*ActivityManagermActivityManager=((ActivityManager)context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE));List<ActivityManager.RunningTaskInfo>taskInfos=mActivityManager.getRunningTasks(1);Class<?>_class=taskInfos.get(0).topActivity.getClass();*///方法二:从AppManger的Stack中拿到当前的ActivityClass<?>_class=AppManager.getInstance().currentActivity().getClass();if(_class!=null){if(null!=reflectionActivity()){//拿到反射的数据Bundle_bundle=reflectionActivity();if(_bundle!=null){name=_bundle.getString("name");avatar=_bundle.getString("avatar");}}NotificationUtils_notifyUtils=NotificationUtils.getInstance();_notifyUtils.init(context.getApplicationContext(),_class);_notifyUtils.showNotification("从"+name+"退出到后台");}break;}}

注意上面代码:有两种方式拿到当前的Activity. 这两个这里先简单介绍,后面详细解释 稍微注意下第21行:这里主要通过反射拿到当前Activity要传给通知栏显示的信息,; 而通知栏的主要代码如下:没什么好解释的

publicvoidshowNotification(@NonNullStringcontentText){PendingIntent_pendingIntent=PendingIntent.getActivity(mContext,notifId,mNotificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);NotificationCompat.Builderbuilder=newNotificationCompat.Builder(mContext);builder.setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(),R.mipmap.ic_launcher)).setSmallIcon(R.mipmap.ic_launcher).setContentTitle("通知测试").setContentText(contentText).setSubText(mContext.getString(R.string.notice_click_into)).setPriority(Notification.PRIORITY_HIGH).setVibrate(newlong[]{0,0,0,10})//.setFullScreenIntent(_pendingIntent,true).setContentIntent(_pendingIntent);//在什么状态下显示通知,比如锁屏状态if(Build.VERSION.SDK_INT>=21){builder.setVisibility(Notification.VISIBILITY_PUBLIC);builder.setCategory(Notification.CATEGORY_MESSAGE);}mNotification=builder.build();mNotificationManager.notify(notifId,mNotification);}

关于怎样获取当前的Activity,这里是主要的关键,这里我使用了两种方法: 方法二: 我自己手动建立了一个Activity的Stack的工具栏,然后对Activity进行增删操作处理,主要代码如下:

publicclassAppManager{privatestaticAppManagerinstance;privatestaticStack<Activity>activityStack;publicstaticAppManagergetInstance(){if(instance==null){//懒汉双层锁,保证线程安全synchronized(AppManager.class){if(instance==null){instance=newAppManager();}}}returninstance;}/***添加Activity到stack中*/publicvoidaddActivity(Activityactivity){if(activityStack==null){activityStack=newStack<>();}if(activityStack.contains(activity)){activityStack.remove(activity);}activityStack.add(activity);}/***获取stack中当前的Activity*/publicActivitycurrentActivity(){if(null!=activityStack&&null!=activityStack.lastElement()){returnactivityStack.lastElement();}returnnull;}/***移除当前的Activity*/publicvoidfinishActivity(){if(null!=activityStack&&null!=activityStack.lastElement()){finishActivity(activityStack.lastElement());}}}

这是一个单例,然后在BaseActivity的onCreate中调用Add方法,在Activity要finish的时候,调用这里的finishActivity方法,而CurrentActivity就是我们需要的当前的Activity;

@OverrideprotectedvoidonCreate(@NullableBundlesavedInstanceState){super.onCreate(savedInstanceState);AppManager.getInstance().addActivity(this);}

另外还有一种方式就是获取当前Activity的方法,就是程序系统本身就有一个Stack的,我们可以通过管理 ActivityManager. getRunningTasks(1) 来拿到当前的Activity,这是我在网上看到的.

ActivityManagermActivityManager=((ActivityManager)_app.getSystemService(Context.ACTIVITY_SERVICE));List<RunningTaskInfo>taskInfos=mActivityManager.getRunningTasks(1);Class<?>intentActivity=taskInfos.get(0).topActivity.getClass();
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Android切换前后台点击通知进入当前页面怎么实现的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Golang中的字符串类型为什么不能修改下一篇:

5 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18