您好,登錄后才能下訂單哦!
本篇內容主要講解“Android切換前后臺點擊通知進入當前頁面怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Android切換前后臺點擊通知進入當前頁面怎么實現”吧!
首先,先展示效果,有圖才有真相
效果如上圖,當我們按下back鍵或者HOME鍵的時候.程序退到后臺,彈出通知,點開通知回到當前頁面. 在上節中,我有講述到判斷程序退到后臺的兩種方式. 第一種方式:在BaseActivity中onPause方法中判斷程序退出后臺之后,進入廣播頁面:
public class BaseActivity extends AppCompatActivity { private static final String TAG = "BaseActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppManager.getInstance().addActivity(this); } @Override protected void onPause() { super.onPause(); if(!isAppOnForeground()){ Toast.makeText(getApplicationContext(), TAG+"onPause:", Toast.LENGTH_SHORT).show(); }else { Log.e(TAG, "onPause: "+"彈出通知"); //第一種方式退到后臺 Intent _intent = new Intent(DemoBroadcastReceiver.ACTION_NOTIFY_MESSAGE); _intent.setClass(getApplicationContext(), DemoBroadcastReceiver.class); sendBroadcast(_intent); } }
第二種方式,在Application中中onStopActivity方法中判斷程序退出后臺之后,進入廣播頁面:
@Override public void onActivityStopped(Activity activity) { countActivity--; L.i("onActivityStopped", "countActivity=" + countActivity); if (countActivity <= 0) { if (WDRTCSysConfig.getInstance().isCalling()) { Intent _intent = new Intent(WDBroadcastReceiver.ACTION_ENABLE_MESSAGES); _intent.setClass(getApplicationContext(), WDBroadcastReceiver.class); sendBroadcast(_intent); } } }
不管是方法一或者 方法 二:都是進入廣播服務中,進行判斷然后彈出Notification通知出來.主要代碼如下:
@Override public void onReceive(Context context, Intent intent) { switch (intent.getAction()) { case ACTION_NOTIFY_MESSAGE: String name = null; String avatar = null; //方法一:從系統的Stack中拿到當前的Activity /* ActivityManager mActivityManager = ((ActivityManager) context.getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE)); List<ActivityManager.RunningTaskInfo> taskInfos = mActivityManager.getRunningTasks(1); Class<?> _class = taskInfos.get(0).topActivity.getClass(); */ //方法二:從AppManger的Stack中拿到當前的Activity Class<?> _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要傳給通知欄顯示的信息,; 而通知欄的主要代碼如下:沒什么好解釋的
public void showNotification(@NonNull String contentText){ PendingIntent _pendingIntent = PendingIntent.getActivity(mContext, notifId, mNotificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.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(new long[]{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進行增刪操作處理,主要代碼如下:
public class AppManager { private static AppManager instance; private static Stack<Activity> activityStack; public static AppManager getInstance() { if (instance == null) { //懶漢雙層鎖,保證線程安全 synchronized (AppManager.class) { if (instance == null) { instance = new AppManager(); } } } return instance; } /** * 添加Activity到stack中 */ public void addActivity(Activity activity) { if (activityStack == null) { activityStack = new Stack<>(); } if (activityStack.contains(activity)) { activityStack.remove(activity); } activityStack.add(activity); } /** * 獲取stack中當前的Activity */ public Activity currentActivity() { if (null != activityStack && null != activityStack.lastElement()) { return activityStack.lastElement(); } return null; } /** * 移除當前的Activity */ public void finishActivity() { if (null != activityStack && null != activityStack.lastElement()) { finishActivity(activityStack.lastElement()); } } }
這是一個單例,然后在BaseActivity的onCreate中調用Add方法,在Activity要finish的時候,調用這里的finishActivity方法,而CurrentActivity就是我們需要的當前的Activity;
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppManager.getInstance().addActivity(this); }
另外還有一種方式就是獲取當前Activity的方法,就是程序系統本身就有一個Stack的,我們可以通過管理 ActivityManager. getRunningTasks(1) 來拿到當前的Activity,這是我在網上看到的.
ActivityManager mActivityManager = ((ActivityManager) _app .getSystemService(Context.ACTIVITY_SERVICE)); List<RunningTaskInfo> taskInfos = mActivityManager.getRunningTasks(1); Class<?> intentActivity = taskInfos.get(0).topActivity.getClass();
到此,相信大家對“Android切換前后臺點擊通知進入當前頁面怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。