1. 程式人生 > >Android 接收到通知,點選通知欄開啟相應介面

Android 接收到通知,點選通知欄開啟相應介面

       通知訊息在Android端是一個非常重要的事件,常常會使用到。三方通知也有很多的提供,當然我們也可以自己定義通知欄樣式。來滿足和實現接收到通知並顯示在通知欄上。

        現在也不做這些說明,只說明怎麼樣在收到通知後,點選通知欄並開啟相應的介面。當然也是通過檢視一些大神書寫的文章並實現功能。現在記錄一下,方便以後檢視。

         說明:接入的是三方的極光推送 ,如果你不知道怎麼接入。那麼請你自行去閱讀極光推送接入文件。

         當然我們在接收極光推送的時候,必須自定義接收器。這樣就能夠接收到我們自定義的訊息。不然在接收通知的時候有可能接收不到訊息,或者不能夠開啟對應的介面。

           實在抱歉沒有圖片,因為很多原因。

/**
 * 自定義接收器
 * 
 * 如果不定義這個 Receiver,則:
 * 1) 預設使用者會開啟主介面
 * 2) 接收不到自定義訊息    
 */
public class MyReceiver extends BroadcastReceiver {
   private static final String TAG = "JIGUANG-Example";

   @Override
   public void onReceive(Context context, Intent intent) {
      try {
         Bundle bundle = intent.getExtras();
         if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID);
            Log.d(TAG, "[MyReceiver] 接收Registration Id : " + regId);
            //send the Registration Id to your server...
         } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下來的自定義訊息: " + bundle.getString(JPushInterface.EXTRA_MESSAGE));
            processCustomMessage(context, bundle);
         } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Log.d(TAG, "[MyReceiver] 接收到推送下來的通知");
         } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            String type = bundle.getString(JPushInterface.EXTRA_EXTRA);
         } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) {
//          Logger.d(TAG, "[MyReceiver] 使用者收到到RICH PUSH CALLBACK: "bundle.getString(JPushInterface.EXTRA_EXTRA));
         } else if(JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) {
            boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false);
            Log.w(TAG, "[MyReceiver]" + intent.getAction() +" connected state change to "+connected);
         } else {
            Log.d(TAG, "[MyReceiver] Unhandled intent - " + intent.getAction());
         }
      } catch (Exception e){

      }
   }

}

自定義接收器,就是對其進行重寫的一個方法。當然必須在 manifest中去註冊你自定義的接收器

<!-- User defined。 使用者自定義的廣播接收器-->
<receiver
    android:name="你的位置.MyReceiver"
    android:exported="false"
    android:enabled="true">
    <intent-filter>
        <action android:name="cn.jpush.android.intent.REGISTRATION" /> <!--Required  使用者註冊SDK的intent-->
        <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> <!--Required  使用者接收SDK訊息的intent-->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> <!--Required  使用者接收SDK通知欄資訊的intent-->
        <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> <!--Required  使用者開啟自定義通知欄的intent-->
        <action android:name="cn.jpush.android.intent.CONNECTION" /><!-- 接收網路變化 連線/斷開 since 1.6.3 -->
        <category android:name="你的包名" />
    </intent-filter>
</receiver>

現在就是開始介紹怎麼樣開啟對應的頁面了。

當然所對應的操作必須在指定的方法裡面才能夠執行。

JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction()) // 開啟通知方法裡新增程式碼操作。

在這些都熟悉後,最重要的事情現在開始。

一般在接收到通知後,會有兩種可能。

第一:當APP正在執行的時候;

第二:當APP已經被殺死

當然第一種情況比較簡單,我們只需要開啟對應的Activity就行了。當然如果app的程序雖然仍然在但Task棧已經空了,比如使用者點選Back鍵退出應用,但程序還沒有被系統回收,如果直接啟動對應Activity,再按Back鍵就不會返回MainActivity了。所以在啟動對應Activity前,要先啟動MainActivity。

Intent mainIntent = new Intent(context, MainActivity.class);
//將MainAtivity的launchMode設定成SingleTask, 或者在下面flag中加上Intent.FLAG_CLEAR_TOP,
//如果Task棧中有MainActivity的例項,就會把它移到棧頂,把在它之上的Activity都清理出棧,
//如果Task棧不存在MainActivity例項,則在棧頂建立
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent detailIntent = new Intent(context, 對應Activity.class);
Intent[] intents = {mainIntent, detailIntent};
context.startActivities(intents);

這樣我們就能夠開啟所對應的介面了。

第二種就比較麻煩一點,下面來詳細介紹一下。

如果app程序已經被殺死,先重新啟動app,將對應Activity的啟動引數傳入Intent中,

引數經過SplashActivity傳入MainActivity,此時app的初始化已經完成,

在MainActivity中就可以根據傳入引數跳轉到對應Activity中去了。

Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage("你的包名");
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
Bundle args = new Bundle();
args.putString("name", "開啟通知Activity");
launchIntent.putExtra(Constants.EXTRA_BUNDLE, args);
context.startActivity(launchIntent);

然後在SplashActivity裡面去接收到通知並做處理。

Intent intent = new Intent(SplashActivity.this, MainActivity.class);
//如果啟動app的Intent中帶有額外的引數,表明app是從點選通知欄的動作中啟動的
//將引數取出,傳遞到MainActivity中
if(getIntent().getBundleExtra(Constants.EXTRA_BUNDLE) != null){
    intent.putExtra(Constants.EXTRA_BUNDLE, getIntent().getBundleExtra(Constants.EXTRA_BUNDLE));
}
startActivity(intent);

當將引數傳遞過去後,我們在MainActivity裡面,將接收到的引數進行判斷並做出對應的操作。

if(getIntent().getBundleExtra(Constants.EXTRA_BUNDLE) != null) {
    intentToActivity(對應Activity.class);
}
/**
 * 介面跳轉
 * @param tarActivity
 */
protected void intentToActivity(Class<? extends Activity> tarActivity) {
    Intent intent = new Intent(mContext, tarActivity);
    startActivity(intent);
}

這樣我們就能夠開啟對應的Activity了。

差點忘記一件大事,就是判斷APP是否存活,實在抱歉。

/**
 * 方法描述:判斷某一應用是否正在執行
 * @param context     上下文
 * @param packageName 應用的包名
 * @return true 表示正在執行,false 表示沒有執行
 */
public static boolean isAppRunning(Context context, String packageName) {
   ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
   List<ActivityManager.RunningTaskInfo> list = am.getRunningTasks(100);
   if (list.size() <= 0) {
      return false;
   }
   for (ActivityManager.RunningTaskInfo info : list) {
      if (info.baseActivity.getPackageName().equals(packageName)) {
         return true;
      }
   }
   return false;
}

通過上面的方法,我們就能夠開啟相應的介面了。

相關推薦

Android 接收通知通知欄開啟相應介面

       通知訊息在Android端是一個非常重要的事件,常常會使用到。三方通知也有很多的提供,當然我們也可以自己定義通知欄樣式。來滿足和實現接收到通知並顯示在通知欄上。         現在也不做這些說明,只說明怎麼樣在收到通知後,點選通知欄並開啟相應的介面。當然也是

Android瀏覽圖片放大至全屏效果

最近做一個專案類似於QQ空間,做到照片瀏覽的功能,對於QQ空間中點選圖片放大至全屏,感覺效果很贊,於是也做了個類似的效果。如下。 我不知道QQ那個是怎麼做的,我的思路如下: 首先,從圖片縮略介面跳轉到圖片詳情頁面,應該是從一個Activit

Android簡單互動控制元件時短暫的放大後恢復正常

原理:監聽控制元件的事件,在touch事件觸發是播放放大動畫; 說明:在onTouch()事件中,動畫的播放要放在對DOWN事件的處理中,不能簡單的放在onTouch()的方法裡面裡了事,那樣會有一

仿Android開發者選項七下顯示除錯介面

private int clickCount = 0; private long clickTime = 0; sevenClickView.setOnClickListener(new View.OnClickListener() { @Override public void

VS程式設計編輯WPF過程中設計器中介面某一控制元件在XAML中高亮突出顯示相應的控制元件程式碼的設定方法。

在編輯製件WPF過程中,當介面中控制元件較多時,可通過點選設計器中具體的控制元件,從而中在xaml程式碼視窗中快速跳轉到對應的部分。為了突出顯示該部分控制元件程式碼的名稱,方便視覺上直觀的觀察到被選中的控制元件對應的XAML程式碼,可以在VS中設定:選中控制元件後,高亮顯示對應的XAML

react 模擬從後臺獲取選單資料頂部選單切換介面的筆記

 本文是基於Ant design Pro 2.0做的筆記,官方提供的demo(官方demo下載地址),路由是程式配置的,不能滿足專案需求,所以在研究過程中,把所遇到的問題,做一個筆記,最終效果圖如下:   一:需求描述   1 從介面獲取選單,替換預設demo的選單。   &n

Android實現通知欄先啟動應用再開啟目標Activity

情況簡述 在開發Android app的過程中,遇到這樣一個需求:app中啟動一個Service,該Service在獨立程序中執行,與伺服器保持長連線,將伺服器推送過來的訊息在通知欄中顯示,並設定點選動作,點選後跳轉到app中對應的Activity。目前遇到的問題是Se

8.0通知欄新增通知渠道及自定義通知 響應事件

今天寫了下demo 發現通知在8.0後有些改變記錄下這個坑!!!! 通知的程式碼大家在網上一搜一大把,我也不廢話 直接上重點。 點擊發送通知,沒有通知顯示,程式碼如下。 日誌資訊 明明走了這行程式碼卻什麼也沒發生,what? 難道寫錯了?,後來查看了資料下才知道是8

Android 通知欄訊息開啟activity,並判斷app是否執行

android的通知欄訊息點選事件如果是開啟一個activity時,我們要考慮兩種情況: 應用正在前臺執行。 應用已退出。 如果是第一種情況那麼就好處理了,直接為Intent設定flag為FLAG_ACTIVITY_NEW_TASK,然後呼叫context.

Android 實現微信QQ的程式前後臺切換 back鍵切換後臺 通知欄恢復前臺

                實現類似微信,QQ的前後臺切換:back鍵切換後臺;點選通知欄恢復前臺。1、back鍵切換後臺的實現:這個實現需要在主activity重寫onbackpressed()方法。程式碼如下:@Override    public void onBackPressed() {    

android 使用Notification彈多個通知跳轉intent取值時總是最後一個

最近開發中模組功能,使用NotificationManager觸發多個Notification: private void showIMNotification(Context context, String ticker, Bitmap defaultBitmap

Android 通知欄中的通知啟動應用

今天再做專案中遇到一個問題: "點選通知時, 應用不能啟動", 原始碼如下:  Context application = getApplicationContext(); Intent resultIntent = new Intent(application, Ma

android 如何通知欄中的前臺服務返回當前正在進行的活動

剛開始編寫的時候在處理PendingIntent時,就是簡單的讓所開啟的intent  new出想回到的活動,但是後來發現這樣實際上只是新建了一個相同的活動覆蓋住了正在進行的活動上,就像寫的音樂播放器,在後臺的時候若我

Android實現通知欄通知恢復前臺

通過廣播來實現,參考 http://www.ithtw.com/5684.html(leehom2015年09月15日 於 IT十萬為什麼 發表) 我的實現方法是不通過廣播,而是通過PendingIntent實現跳轉: Intent intent = new Intent

記錄Android開發一個小坑佈局檔案TextView中新增onClick後無效問題

自己寫東西的時候,在TextView上添加了onClick去增加點選事件,去跳轉另一個Activity,執行後結果點選無效,新增Toast,Toast也不顯示,程式碼如下: <TextView android:layout_width="wrap_content"

做一個應用圖示圖示後開啟一個網頁

一、建一個MainActivity.java檔案 在路徑:7731e81\sc7731e.81.az\packages\apps\Launcher3\src\com\ww\taobao\下 二、新增字串 在路徑:7731e81\sc7731e.81.az\packages\apps\Laun

Android VideoView 自動播放與重播暫停與繼續

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //set no title bar

安裝App後開啟。再按home回首頁開啟出現App重複載入的問題

安裝App後,點選開啟。再按home回首頁,再開啟,出現App重複載入的問題  具體表現是:   1、將app包通過電腦QQ傳送到手機QQ上面,點選安裝,安裝後選擇開啟app (此間的應用邏輯應該是要觸發 【閃屏頁Activity】, 然後跳轉 【主頁Activity】)   2

問題:windows---筆記本外接顯示器在系統更新後外接顯示器沒有反應右鍵開啟顯示設定檢測後提示未檢測到其他顯示器

由於系統更新後,驅動程式也更新了,所以需要重新設定驅動來解決這個問題。 1.可以下載一個驅動精靈來檢測一下是否有未升級的顯示卡驅動,重新升級後,再重新啟動系統。 2.下載好了驅動也沒有改變的話就點選快捷鍵Windows+ X 進入裝置管理器頁面 顯示介面卡的位置會有一個帶有----

Android WebView 圖片超出寬度自適應檢視大圖

webView 配置  WebSettings webSettings = webView.getSettings(); webSettings.setJava