版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BlogRecord/article/details/54834706
功能需求:
// ============= 功能需求 =================
// 1.当App在前台可见时,点击通知栏推送消息时,直接跳转到对应的页面(TipsActivity)
// 2.当App在后台不可见时(未关闭),点击通知栏推送消息时,直接跳转到对应的页面(TipsActivity)
// 3.当App关闭时,点击通知栏推送消息时,先显示欢迎页面,然后直接跳转到对应的页面(TipsActivity)(返回时回到首页,而非关闭App)
// ==================
// 按照该解决方法,搬运到自己项目中,就可以解决该问题
// 如同微信,后台关闭了,则先显示欢迎页面,然后显示消息,返回则回到首页,未关闭则不打开欢迎页面
实现思路:
// ============= 处理的思路 =================
// 首先创建BaseActivity类,是让全部Activity都继承该类,然后在onStart里面处理是否推送
// 接着创建 PushHanderActivity类,中转处理推送消息,点击通知消息时都跳转到该类,该类通过Acitivyt Task处理App在前后台情况控制
// ==
// 1.当App关闭时,则会自动先打开WelComeActivity,然后触发onStart方法,因为欢迎页面还不需要进行跳转
// 所以在PushHanderActivity 的isHandler方法过滤了需要不处理的类,然后在MainActivity的onStart里面触发推送消息,然后才跳转到TipsActivity
// 2.当App在前台可见、后台不可见(未关闭)时,因为设置了addCategory,则不会再从WelComeActivity启动,而是直接触发onStart方法,就会进行判断是否跳转到TipsActivity
// ==
// 也预留了不同类型跳转到不同的页面,便于后台控制 PushHanderActivity - checkPush - switch(pushMsgVo.pmType)
// --- 可能贴代码,比较难理解,最下面有代码链接
// 处理判断的代码 onStart - PushHanderActivity.checkPush(claName, this);
实现代码:
package com.push.pro.activitys;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.push.pro.BaseActivity;
import com.push.pro.R;
import com.push.pro.push.PushMsgVo;
import com.push.pro.push.PushReceiver;
import org.json.JSONObject;
import java.util.Random;
/**
* 首页Activity
*/
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// --
((Button) this.findViewById(R.id.am_btn)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Random random = new Random();
// --
PushMsgVo pushMsgVo = new PushMsgVo();
pushMsgVo.pmType = 2;
pushMsgVo.pmMsg = "推送消息 - " + System.currentTimeMillis() + " - " + random.nextInt(50);
pushMsgVo.pmTitle = "推送标题 - " + System.currentTimeMillis() + " - " + random.nextInt(50);
// ==
JSONObject jsonObj = new JSONObject();
try{
jsonObj.put("type", pushMsgVo.pmType);
jsonObj.put("msg", pushMsgVo.pmMsg);
jsonObj.put("title", pushMsgVo.pmTitle);
} catch (Exception e){
}
// 发送广播
Intent intent = new Intent(mContext, PushReceiver.class);
Bundle bundle = new Bundle();
bundle.putString("pushMsg", jsonObj.toString());
intent.putExtras(bundle);
sendBroadcast(intent);
}
});
// ======= 注册广播 ========
// 注册监听广播
IntentFilter filter = new IntentFilter();
filter.addAction("com.push.pro.push.PushReceiver");
mContext.registerReceiver(new PushReceiver(), filter);
}
}
-
package com.push.pro.activitys;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import com.push.pro.BaseActivity;
import com.push.pro.R;
import com.push.pro.push.PushMsgVo;
public class TipsActivity extends BaseActivity {
/** 显示推送内容 */
private TextView am_tips_tv;
// === 其他对象 ===
public static final String PUSH_MSG_VO = "pushMsgVo";
/** 消息内容实体类 */
private PushMsgVo pushMsgVo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tips);
// --
am_tips_tv = (TextView) this.findViewById(R.id.am_tips_tv);
// 获取推送消息
Intent intent = getIntent();
if (intent != null && intent.hasExtra(PUSH_MSG_VO)){
try{
pushMsgVo = (PushMsgVo) intent.getSerializableExtra(PUSH_MSG_VO);
} catch (Exception e){
e.printStackTrace();
}
}
// --
if (pushMsgVo != null){
// 拼接消息内容
StringBuilder sBuilder = new StringBuilder();
sBuilder.append("\r\npmType: " + pushMsgVo.pmType);
sBuilder.append("\r\npmMsg: " + pushMsgVo.pmMsg);
sBuilder.append("\r\npmTitle: " + pushMsgVo.pmTitle);
// 显示消息内容
am_tips_tv.setText(sBuilder.toString());
}
}
}
-
package com.push.pro.push;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import com.push.pro.R;
public class PushReceiver extends BroadcastReceiver {
/** 日志Tag */
private final String TAG = "PushReceiver";
@Override
public void onReceive(Context mContext, Intent intent) {
// ==== 初始化通知管理类 ====
if(mNotificationManager == null){
mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
}
// ========================
Bundle bundle = intent.getExtras();
if (bundle != null){
if (bundle.containsKey("pushMsg")){
// 获取推送消息
String pushMsg = bundle.getString("pushMsg");
// 显示通知
displayNotification(mContext, pushMsg);
}
}
}
/** 通知栏管理类 */
private static NotificationManager mNotificationManager = null;
/**
* 显示通知
* @param mContext 上下文
* @param pushMsg 推送的消息
*/
public void displayNotification(Context mContext, String pushMsg) {
if(TextUtils.isEmpty(pushMsg)){
return;
}
// 解析数据
PushMsgVo pushMsgVo = PushMsgVo.analyPushMsgVoJson(pushMsg);
// 通知标题
String title = pushMsgVo.pmTitle;
// 通知内容
String content = pushMsgVo.pmMsg;
// 防止消息都为null
if(title == null || content == null){
return;
}
// ----
// 设置通知栏id
int notifyId = (int) System.currentTimeMillis();
// ======== 跳转到推送中转Activity ========
Intent intent = new Intent(mContext, PushHanderActivity.class);
intent.putExtra(PushHanderActivity.PUSH_MSG, pushMsg); // 设置推送消息
PendingIntent pIntent = PendingIntent.getActivity(mContext, notifyId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// // -- 初始化通知信息实体类 --
// Notification notification = new Notification();
// // 设置图标
// notification.icon = R.drawable.ic_launcher;
// // 设置标题
// notification.tickerText = title;
// // 设置时间
// notification.when = System.currentTimeMillis();
// // 设置消息提醒,震动 | 声音
// notification.defaults = Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND;
// /* 点击了此通知则取消该通知栏 */
// notification.flags |= Notification.FLAG_AUTO_CANCEL;
// /* 用上面的属性初始化 Nofification */
// notification.setLatestEventInfo(mContext, title, content, pIntent);
// /* 显示通知栏 */
// mNotificationManager.notify(notifyId, notification);
// ===
// 新建Notification.Builder对象
Notification.Builder builder = new Notification.Builder(mContext);
builder.setContentTitle(title); // 设置标题
builder.setContentText(content); // 设置内容
builder.setSmallIcon(R.mipmap.ic_launcher); // 设置图标
builder.setContentIntent(pIntent); // 执行intent
// 将builder对象转换为普通的notification
Notification notification = builder.getNotification();
// 设置图标
notification.icon = R.mipmap.ic_launcher;
// 设置标题
notification.tickerText = title;
// 设置时间
notification.when = System.currentTimeMillis();
// 设置消息提醒,震动 | 声音
notification.defaults = Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND;
/* 点击了此通知则取消该通知栏 */
notification.flags |= Notification.FLAG_AUTO_CANCEL;
/* 显示通知栏 */
mNotificationManager.notify(notifyId,notification);
}
}
-
package com.push.pro.push;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import com.push.pro.activitys.TipsActivity;
import com.push.pro.activitys.WelComeActivity;
import com.push.pro.utils.SharePreferencesUtils;
/**
* 推送消息处理Activity - 不需要继承BaseActivity
*/
public class PushHanderActivity extends Activity {
/** 推送消息Key */
public static final String PUSH_MSG = "pushMsg";
/** 判断是否点击了推送通知栏消息 */
public static final String IS_CLICK_PUSH_MSG = "isClickPushMsg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 进行处理点击通知栏推送消息
handlerPushOp(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 进行处理点击通知栏推送消息
handlerPushOp(intent);
}
// =====================================================
/**
* 处理推送操作
* @param intent 获取传递的数据
*/
private void handlerPushOp(Intent intent) {
// 推送数据
String pushData = null;
// 判读是否存在数据
if(intent != null && intent.hasExtra(PushHanderActivity.PUSH_MSG)){
try {
// 获取推送数据
pushData = intent.getStringExtra(PushHanderActivity.PUSH_MSG);
} catch (Exception e) {
e.printStackTrace();
}
}
// 判断是否存在推送数据
if(TextUtils.isEmpty(pushData)){
// 关闭当前页面
finish();
return;
}
// 保存状态 - 是否存在推送消息
SharePreferencesUtils.setBoolean(PushHanderActivity.this, PushHanderActivity.IS_CLICK_PUSH_MSG, true);
// 保存数据
SharePreferencesUtils.setString(PushHanderActivity.this, PushHanderActivity.PUSH_MSG, pushData);
// 关闭当前页面
finish();
// ================= 进行跳转 =================
Intent pIntent = new Intent(Intent.ACTION_MAIN);
pIntent.addCategory(Intent.CATEGORY_LAUNCHER);
pIntent.setComponent(new ComponentName(PushHanderActivity.this.getPackageName(), WelComeActivity.class.getCanonicalName()));
pIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
startActivity(pIntent);
// ============================================
}
/**
* 是否进行处理(判断类,防止都进行触发判断)
* @param claName 类名
*/
private static boolean isHandler(String claName){
// 防止为null
if (TextUtils.isEmpty(claName)){
return false;
}
// ---
if(claName.equals(WelComeActivity.class.getSimpleName())){
return false; // 属于欢迎页面则不进行处理
} else if (claName.equals("GuideActivity")){
return false; // 属于引导页面则不进行处理
}
// 默认进行处理
return true;
}
/**
* 检查推送操作
* @param mContext 上下文
*/
public static void checkPush(Context mContext){
if (mContext != null){
try {
// 判断是否点击推送消息 - 必须点击了才进行处理
if(SharePreferencesUtils.getBoolean(mContext, PushHanderActivity.IS_CLICK_PUSH_MSG, false)){
// 清空状态
SharePreferencesUtils.setBoolean(mContext, PushHanderActivity.IS_CLICK_PUSH_MSG, false);
// 获取数据
String msgData = SharePreferencesUtils.getString(mContext, PushHanderActivity.PUSH_MSG, null);
// 如果为null,则重置
if(TextUtils.isEmpty(msgData)){
return;
}
// 清空数据
SharePreferencesUtils.setString(mContext, PushHanderActivity.PUSH_MSG, null);
// ====================== JSON解析数据处理需要操作的页面 ======================
// 解析数据
PushMsgVo pushMsgVo = PushMsgVo.analyPushMsgVoJson(msgData);
// 判断类型,如果属于订阅消息(他人)
switch(pushMsgVo.pmType){
case 1:
// mContext.startActivity(new Intent(mContext, Class.class));
break;
case 2:
// 跳转页面 - 提示页面
Intent intent = new Intent(mContext, TipsActivity.class);
intent.putExtra(TipsActivity.PUSH_MSG_VO, pushMsgVo);
mContext.startActivity(intent);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 检查推送
* @param claName 类名
* @param mContext 上下文
*/
public static void checkPush(String claName, Context mContext){
if (isHandler(claName)){ // 进行过滤类,判断是否进行处理
checkPush(mContext);
}
}
}
-
package com.push.pro.push;
import org.json.JSONObject;
import java.io.Serializable;
/**
* 推送消息实体类
*/
public class PushMsgVo implements Serializable{
/** 类型*/
public int pmType;
/** 消息 */
public String pmMsg;
/** 标题 */
public String pmTitle;
// =========================
/**
* 解析推送消息信息
* @param json
* @return
*/
public static PushMsgVo analyPushMsgVoJson(String json){
try {
// 生成JSON对象
JSONObject jsonObj = new JSONObject(json);
// 初始化信息实体类
PushMsgVo pushMsgVo = new PushMsgVo();
/** 类型 */
pushMsgVo.pmType = jsonObj.getInt("type");
/** 消息 */
pushMsgVo.pmMsg = jsonObj.getString("msg");
/** 标题息 */
pushMsgVo.pmTitle = jsonObj.getString("title");
return pushMsgVo;
} catch (Exception e) {
}
return null;
}
}
-
package com.push.pro;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import com.push.pro.push.PushHanderActivity;
/** Activity 基类 */
public class BaseActivity extends Activity {
/** 日志Tag */
private String TAG = "BaseActivity";
/** 上下文 */
protected Context mContext = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
try {
// TAG = this.getClass().getName();
TAG = this.getClass().getSimpleName();
} catch (Exception e) {
}
mContext = this;
// 打印日志
printLog("onCreate");
}
@Override
protected void onStart() {
super.onStart();
printLog("onStart");
}
@Override
protected void onRestart() {
super.onRestart();
printLog("onRestart");
}
@Override
protected void onResume() {
super.onResume();
printLog("onResume");
// 获取类名
String claName = this.getClass().getSimpleName();
// 检查推送
PushHanderActivity.checkPush(claName, this);
}
@Override
protected void onPause() {
super.onPause();
printLog("onPause");
}
@Override
protected void onStop() {
super.onStop();
printLog("onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
printLog("onDestroy");
}
// ========================= 其他自定义方法 =========================
/**
* 统一打印日志
* @param message 打印内容
*/
private final void printLog(String message) {
Log.d(TAG, TAG + " -> " + message);
}
}