Android切換前后臺點擊通知進入當前頁面
在上一節(jié)講述了,本人使用的怎么判斷App退到后臺的兩種方式,這里主要講述當App退出到后臺的后,怎么點擊通知回到原來按下HOME鍵之前的前臺頁面.
首先,先展示效果,有圖才有真相

效果如上圖,當我們按下back鍵或者HOME鍵的時候.程序退到后臺,彈出通知,點開通知回到當前頁面. 在上節(jié)中,我有講述到判斷程序退到后臺的兩種方式. 第一種方式:在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;
//方法一:從系統(tǒng)的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()) {
//拿到反射的數(shù)據(jù)
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);
//在什么狀態(tài)下顯示通知,比如鎖屏狀態(tài)
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的方法,就是程序系統(tǒng)本身就有一個Stack的,我們可以通過管理 ActivityManager. getRunningTasks(1) 來拿到當前的Activity,這是我在網(wǎng)上看到的.
ActivityManager mActivityManager = ((ActivityManager) _app
.getSystemService(Context.ACTIVITY_SERVICE));
List<RunningTaskInfo> taskInfos = mActivityManager.getRunningTasks(1);
Class<?> intentActivity = taskInfos.get(0).topActivity.getClass();但是由于 mActivityManager . getRunningTasks ( 1 ) 在 API21以后是過期的,而且需要一個task的配置權限.本人沒有使用它,來進行處理.好了,大致的程序就是這些,具體的可以下載demo; 點擊這里:Demo下載
到此這篇關于Android切換前后臺點擊通知進入當前頁面的文章就介紹到這了,更多相關android切換前后臺內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Android使用CountDownTimer類實現(xiàn)倒計時鬧鐘
這篇文章主要為大家詳細介紹了Android使用CountDownTimer類實現(xiàn)倒計時鬧鐘,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
Flutter?LinearProgressIndicator使用指南分析
這篇文章主要為大家介紹了Flutter?LinearProgressIndicator使用指南分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
Android ListView在Fragment中的使用示例詳解
這篇文章主要介紹了Android ListView在Fragment中的使用,因為工作一直在用mvvm框架,因此這篇文章是基于mvvm框架寫的,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09
Android Handler中的休眠喚醒實現(xiàn)詳解
這篇文章主要為大家介紹了Android Handler中的休眠喚醒實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01
Android?debug包運行正常release包崩潰的解決辦法
這篇文章主要介紹了Android?debug包運行正常,release包崩潰解決辦法,文中通過代碼示例介紹的非常詳細,對大家解決問題有一定的幫助,需要的朋友可以參考下2024-04-04

