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;
}

通过上面的方法,我们就能够打开相应的界面了。

猜你喜欢

转载自blog.csdn.net/sinat_22922949/article/details/81075807