Skip to content

Commit c454e23

Browse files
author
詹强
committed
android-支持应用在被杀死的状态下点击通知启动应用
1 parent fc700f2 commit c454e23

File tree

5 files changed

+184
-99
lines changed

5 files changed

+184
-99
lines changed

android/src/main/AndroidManifest.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,17 @@
1616
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
1717
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
1818

19+
<!-- Optional. Required for location feature -->
20+
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
21+
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
22+
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
23+
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
24+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
25+
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
26+
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
27+
<uses-permission android:name="android.permission.GET_TASKS" />
28+
<uses-permission android:name="android.permission.VIBRATE" />
29+
1930
<application>
2031
<activity
2132
android:name="cn.jpush.android.ui.PopWinActivity"
@@ -56,6 +67,16 @@
5667
</intent-filter>
5768
</receiver>
5869

70+
<receiver
71+
android:name=".receiver.JPushBroadcastReceiver"
72+
android:enabled="true"
73+
android:exported="false">
74+
<intent-filter>
75+
<action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
76+
<category android:name="${applicationId}" />
77+
</intent-filter>
78+
</receiver>
79+
5980
</application>
6081

6182
</manifest>

android/src/main/java/cn/jiguang/plugins/push/JPushModule.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.facebook.react.bridge.ReactMethod;
1111
import com.facebook.react.bridge.ReadableArray;
1212
import com.facebook.react.bridge.ReadableMap;
13+
import com.facebook.react.bridge.WritableMap;
1314

1415
import org.json.JSONObject;
1516

@@ -18,6 +19,8 @@
1819

1920
import cn.jiguang.plugins.push.common.JPushConstans;
2021
import cn.jiguang.plugins.push.common.JPushLogger;
22+
import cn.jiguang.plugins.push.helper.JPushHelper;
23+
import cn.jiguang.plugins.push.receiver.JPushBroadcastReceiver;
2124
import cn.jpush.android.api.BasicPushNotificationBuilder;
2225
import cn.jpush.android.api.JPushInterface;
2326
import cn.jpush.android.data.JPushLocalNotification;
@@ -54,6 +57,11 @@ public void setDebugMode(ReadableMap readableMap) {
5457
@ReactMethod
5558
public void init() {
5659
JPushInterface.init(reactContext);
60+
if (JPushBroadcastReceiver.NOTIFICATION_BUNDLE != null) {
61+
WritableMap writableMap = JPushHelper.convertNotificationBundleToMap(JPushConstans.NOTIFICATION_OPENED, JPushBroadcastReceiver.NOTIFICATION_BUNDLE);
62+
JPushHelper.sendEvent(JPushConstans.NOTIFICATION_EVENT, writableMap);
63+
JPushBroadcastReceiver.NOTIFICATION_BUNDLE = null;
64+
}
5765
}
5866

5967
@ReactMethod
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package cn.jiguang.plugins.push.helper;
2+
3+
import android.os.Bundle;
4+
import android.text.TextUtils;
5+
6+
import com.facebook.react.bridge.Arguments;
7+
import com.facebook.react.bridge.WritableArray;
8+
import com.facebook.react.bridge.WritableMap;
9+
import com.facebook.react.modules.core.DeviceEventManagerModule;
10+
11+
import org.json.JSONObject;
12+
13+
import java.util.Iterator;
14+
import java.util.Set;
15+
16+
import cn.jiguang.plugins.push.JPushModule;
17+
import cn.jiguang.plugins.push.common.JPushConstans;
18+
import cn.jiguang.plugins.push.common.JPushLogger;
19+
import cn.jpush.android.api.CustomMessage;
20+
import cn.jpush.android.api.JPushMessage;
21+
import cn.jpush.android.api.NotificationMessage;
22+
23+
public class JPushHelper {
24+
25+
public static void sendEvent(String eventName, WritableMap params) {
26+
try {
27+
JPushModule.reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, params);
28+
}catch (Throwable throwable){
29+
JPushLogger.e("sendEvent error:"+throwable.getMessage());
30+
}
31+
}
32+
33+
public static WritableMap convertNotificationToMap(String eventType, NotificationMessage message) {
34+
WritableMap writableMap = Arguments.createMap();
35+
writableMap.putString(JPushConstans.NOTIFICATION_EVENT_TYPE, eventType);
36+
writableMap.putString(JPushConstans.MESSAGE_ID, message.msgId);
37+
writableMap.putString(JPushConstans.TITLE, message.notificationTitle);
38+
writableMap.putString(JPushConstans.CONTENT, message.notificationContent);
39+
convertExtras(message.notificationExtras, writableMap);
40+
return writableMap;
41+
}
42+
43+
public static WritableMap convertNotificationBundleToMap(String eventType, Bundle bundle) {
44+
WritableMap writableMap = Arguments.createMap();
45+
writableMap.putString(JPushConstans.NOTIFICATION_EVENT_TYPE, eventType);
46+
writableMap.putString(JPushConstans.MESSAGE_ID, bundle.getString("cn.jpush.android.MSG_ID",""));
47+
writableMap.putString(JPushConstans.TITLE, bundle.getString("cn.jpush.android.NOTIFICATION_CONTENT_TITLE",""));
48+
writableMap.putString(JPushConstans.CONTENT, bundle.getString("cn.jpush.android.ALERT",""));
49+
convertExtras(bundle.getString("cn.jpush.android.EXTRA",""), writableMap);
50+
return writableMap;
51+
}
52+
53+
54+
public static WritableMap convertCustomMessage(CustomMessage customMessage) {
55+
WritableMap writableMap = Arguments.createMap();
56+
writableMap.putString(JPushConstans.MESSAGE_ID, customMessage.messageId);
57+
writableMap.putString(JPushConstans.CONTENT, customMessage.message);
58+
convertExtras(customMessage.extra, writableMap);
59+
return writableMap;
60+
}
61+
62+
public static WritableMap convertJPushMessageToMap(int type, JPushMessage message) {
63+
WritableMap writableMap = Arguments.createMap();
64+
Set<String> tags = message.getTags();
65+
WritableArray tagsArray = Arguments.createArray();
66+
for (String tag : tags) {
67+
tagsArray.pushString(tag);
68+
}
69+
writableMap.putInt(JPushConstans.CODE, message.getErrorCode());
70+
writableMap.putInt(JPushConstans.SEQUENCE, message.getSequence());
71+
switch (type) {
72+
case 1:
73+
writableMap.putArray(JPushConstans.TAGS, tagsArray);
74+
break;
75+
case 2:
76+
writableMap.putBoolean(JPushConstans.TAG_ENABLE, message.getTagCheckStateResult());
77+
writableMap.putString(JPushConstans.TAG, message.getCheckTag());
78+
break;
79+
case 3:
80+
writableMap.putString(JPushConstans.ALIAS, message.getAlias());
81+
break;
82+
}
83+
return writableMap;
84+
}
85+
86+
public static void convertExtras(String extras, WritableMap writableMap) {
87+
if (TextUtils.isEmpty(extras) || extras.equals("{}")) return;
88+
try {
89+
WritableMap extrasMap = Arguments.createMap();
90+
JSONObject jsonObject = new JSONObject(extras);
91+
Iterator<String> it = jsonObject.keys();
92+
while (it.hasNext()) {
93+
String key = it.next();
94+
String value = jsonObject.getString(key);
95+
extrasMap.putString(key, value);
96+
}
97+
writableMap.putMap(JPushConstans.EXTRAS, extrasMap);
98+
} catch (Throwable throwable) {
99+
JPushLogger.w("convertExtras error:" + throwable.getMessage());
100+
}
101+
}
102+
103+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package cn.jiguang.plugins.push.receiver;
2+
3+
import android.content.BroadcastReceiver;
4+
import android.content.Context;
5+
import android.content.Intent;
6+
import android.os.Bundle;
7+
8+
import cn.jiguang.plugins.push.common.JPushLogger;
9+
import cn.jpush.android.api.JPushInterface;
10+
11+
public class JPushBroadcastReceiver extends BroadcastReceiver {
12+
13+
public static Bundle NOTIFICATION_BUNDLE;
14+
15+
@Override
16+
public void onReceive(Context context, Intent data) {
17+
if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(data.getAction())) {
18+
JPushLogger.e("JPushBroadcastReceiver ACTION_NOTIFICATION_OPENED");
19+
try {
20+
NOTIFICATION_BUNDLE = data.getExtras();
21+
Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
22+
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
23+
context.startActivity(intent);
24+
} catch (Throwable throwable) {
25+
JPushLogger.e("JPushBroadcastReceiver ACTION_NOTIFICATION_OPENED error:" + throwable.getMessage());
26+
}
27+
}
28+
}
29+
30+
}
Lines changed: 22 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
11
package cn.jiguang.plugins.push.receiver;
22

33
import android.content.Context;
4-
import android.text.TextUtils;
54

65
import com.facebook.react.bridge.Arguments;
7-
import com.facebook.react.bridge.WritableArray;
86
import com.facebook.react.bridge.WritableMap;
9-
import com.facebook.react.modules.core.DeviceEventManagerModule;
10-
11-
import org.json.JSONObject;
12-
13-
import java.util.Iterator;
14-
import java.util.Set;
157

168
import cn.jiguang.plugins.push.JPushModule;
179
import cn.jiguang.plugins.push.common.JPushConstans;
1810
import cn.jiguang.plugins.push.common.JPushLogger;
11+
import cn.jiguang.plugins.push.helper.JPushHelper;
1912
import cn.jpush.android.api.CmdMessage;
2013
import cn.jpush.android.api.CustomMessage;
2114
import cn.jpush.android.api.JPushMessage;
@@ -24,55 +17,49 @@
2417

2518
public class JPushModuleReceiver extends JPushMessageReceiver {
2619

27-
public void sendEvent(String eventName, WritableMap params) {
28-
JPushModule.reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, params);
29-
}
30-
3120
@Override
3221
public void onMessage(Context context, CustomMessage customMessage) {
3322
JPushLogger.d("onMessage:" + customMessage.toString());
34-
WritableMap writableMap = convertCustomMessage(customMessage);
35-
sendEvent(JPushConstans.CUSTOM_MESSAGE_EVENT, writableMap);
36-
super.onMessage(context, customMessage);
23+
WritableMap writableMap = JPushHelper.convertCustomMessage(customMessage);
24+
JPushHelper.sendEvent(JPushConstans.CUSTOM_MESSAGE_EVENT, writableMap);
3725
}
3826

3927
@Override
4028
public void onNotifyMessageArrived(Context context, NotificationMessage notificationMessage) {
4129
JPushLogger.d("onNotifyMessageArrived:" + notificationMessage.toString());
42-
WritableMap writableMap = convertNotificationToMap(JPushConstans.NOTIFICATION_ARRIVED, notificationMessage);
43-
sendEvent(JPushConstans.NOTIFICATION_EVENT, writableMap);
44-
super.onNotifyMessageArrived(context, notificationMessage);
30+
WritableMap writableMap = JPushHelper.convertNotificationToMap(JPushConstans.NOTIFICATION_ARRIVED, notificationMessage);
31+
JPushHelper.sendEvent(JPushConstans.NOTIFICATION_EVENT, writableMap);
4532
}
4633

4734
@Override
4835
public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) {
4936
JPushLogger.d("onNotifyMessageOpened:" + notificationMessage.toString());
50-
WritableMap writableMap = convertNotificationToMap(JPushConstans.NOTIFICATION_OPENED, notificationMessage);
51-
sendEvent(JPushConstans.NOTIFICATION_EVENT, writableMap);
52-
super.onNotifyMessageOpened(context, notificationMessage);
37+
if (JPushModule.reactContext != null) {
38+
WritableMap writableMap = JPushHelper.convertNotificationToMap(JPushConstans.NOTIFICATION_OPENED, notificationMessage);
39+
JPushHelper.sendEvent(JPushConstans.NOTIFICATION_EVENT, writableMap);
40+
} else {
41+
super.onNotifyMessageOpened(context, notificationMessage);
42+
}
5343
}
5444

5545
@Override
5646
public void onNotifyMessageDismiss(Context context, NotificationMessage notificationMessage) {
5747
JPushLogger.d("onNotifyMessageDismiss:" + notificationMessage.toString());
58-
WritableMap writableMap = convertNotificationToMap(JPushConstans.NOTIFICATION_DISMISSED, notificationMessage);
59-
sendEvent(JPushConstans.NOTIFICATION_EVENT, writableMap);
60-
super.onNotifyMessageDismiss(context, notificationMessage);
48+
WritableMap writableMap = JPushHelper.convertNotificationToMap(JPushConstans.NOTIFICATION_DISMISSED, notificationMessage);
49+
JPushHelper.sendEvent(JPushConstans.NOTIFICATION_EVENT, writableMap);
6150
}
6251

6352
@Override
6453
public void onRegister(Context context, String registrationId) {
6554
JPushLogger.d("onRegister:" + registrationId);
66-
super.onRegister(context, registrationId);
6755
}
6856

6957
@Override
7058
public void onConnected(Context context, boolean state) {
7159
JPushLogger.d("onConnected state:" + state);
7260
WritableMap writableMap = Arguments.createMap();
7361
writableMap.putBoolean(JPushConstans.CONNECT_ENABLE, state);
74-
sendEvent(JPushConstans.CONNECT_EVENT, writableMap);
75-
super.onConnected(context, state);
62+
JPushHelper.sendEvent(JPushConstans.CONNECT_EVENT, writableMap);
7663
}
7764

7865
@Override
@@ -83,32 +70,28 @@ public void onCommandResult(Context context, CmdMessage message) {
8370
writableMap.putString(JPushConstans.COMMAND_EXTRA, message.extra.toString());
8471
writableMap.putString(JPushConstans.COMMAND_MESSAGE, message.msg);
8572
writableMap.putInt(JPushConstans.COMMAND_RESULT, message.errorCode);
86-
sendEvent(JPushConstans.COMMAND_EVENT, writableMap);
87-
super.onCommandResult(context, message);
73+
JPushHelper.sendEvent(JPushConstans.COMMAND_EVENT, writableMap);
8874
}
8975

9076
@Override
9177
public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
9278
JPushLogger.d("onTagOperatorResult:" + jPushMessage.toString());
93-
WritableMap writableMap = convertJPushMessageToMap(1, jPushMessage);
94-
sendEvent(JPushConstans.TAG_ALIAS_EVENT, writableMap);
95-
super.onTagOperatorResult(context, jPushMessage);
79+
WritableMap writableMap = JPushHelper.convertJPushMessageToMap(1, jPushMessage);
80+
JPushHelper.sendEvent(JPushConstans.TAG_ALIAS_EVENT, writableMap);
9681
}
9782

9883
@Override
9984
public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
10085
JPushLogger.d("onCheckTagOperatorResult:" + jPushMessage.toString());
101-
WritableMap writableMap = convertJPushMessageToMap(2, jPushMessage);
102-
sendEvent(JPushConstans.TAG_ALIAS_EVENT, writableMap);
103-
super.onCheckTagOperatorResult(context, jPushMessage);
86+
WritableMap writableMap = JPushHelper.convertJPushMessageToMap(2, jPushMessage);
87+
JPushHelper.sendEvent(JPushConstans.TAG_ALIAS_EVENT, writableMap);
10488
}
10589

10690
@Override
10791
public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
10892
JPushLogger.d("onAliasOperatorResult:" + jPushMessage.toString());
109-
WritableMap writableMap = convertJPushMessageToMap(3, jPushMessage);
110-
sendEvent(JPushConstans.TAG_ALIAS_EVENT, writableMap);
111-
super.onAliasOperatorResult(context, jPushMessage);
93+
WritableMap writableMap = JPushHelper.convertJPushMessageToMap(3, jPushMessage);
94+
JPushHelper.sendEvent(JPushConstans.TAG_ALIAS_EVENT, writableMap);
11295
}
11396

11497
@Override
@@ -117,67 +100,7 @@ public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMess
117100
WritableMap writableMap = Arguments.createMap();
118101
writableMap.putInt(JPushConstans.CODE, jPushMessage.getErrorCode());
119102
writableMap.putInt(JPushConstans.SEQUENCE, jPushMessage.getSequence());
120-
sendEvent(JPushConstans.MOBILE_NUMBER_EVENT, writableMap);
121-
super.onMobileNumberOperatorResult(context, jPushMessage);
122-
}
123-
124-
private WritableMap convertNotificationToMap(String eventType, NotificationMessage message) {
125-
WritableMap writableMap = Arguments.createMap();
126-
writableMap.putString(JPushConstans.NOTIFICATION_EVENT_TYPE, eventType);
127-
writableMap.putString(JPushConstans.MESSAGE_ID, message.msgId);
128-
writableMap.putString(JPushConstans.TITLE, message.notificationTitle);
129-
writableMap.putString(JPushConstans.CONTENT, message.notificationContent);
130-
convertExtras(message.notificationExtras, writableMap);
131-
return writableMap;
132-
}
133-
134-
private WritableMap convertCustomMessage(CustomMessage customMessage) {
135-
WritableMap writableMap = Arguments.createMap();
136-
writableMap.putString(JPushConstans.MESSAGE_ID, customMessage.messageId);
137-
writableMap.putString(JPushConstans.CONTENT, customMessage.message);
138-
convertExtras(customMessage.extra, writableMap);
139-
return writableMap;
140-
}
141-
142-
private WritableMap convertJPushMessageToMap(int type, JPushMessage message) {
143-
WritableMap writableMap = Arguments.createMap();
144-
Set<String> tags = message.getTags();
145-
WritableArray tagsArray = Arguments.createArray();
146-
for (String tag : tags) {
147-
tagsArray.pushString(tag);
148-
}
149-
writableMap.putInt(JPushConstans.CODE, message.getErrorCode());
150-
writableMap.putInt(JPushConstans.SEQUENCE, message.getSequence());
151-
switch (type) {
152-
case 1:
153-
writableMap.putArray(JPushConstans.TAGS, tagsArray);
154-
break;
155-
case 2:
156-
writableMap.putBoolean(JPushConstans.TAG_ENABLE, message.getTagCheckStateResult());
157-
writableMap.putString(JPushConstans.TAG, message.getCheckTag());
158-
break;
159-
case 3:
160-
writableMap.putString(JPushConstans.ALIAS, message.getAlias());
161-
break;
162-
}
163-
return writableMap;
164-
}
165-
166-
private void convertExtras(String extras, WritableMap writableMap) {
167-
if (TextUtils.isEmpty(extras) || extras.equals("{}")) return;
168-
try {
169-
WritableMap extrasMap = Arguments.createMap();
170-
JSONObject jsonObject = new JSONObject(extras);
171-
Iterator<String> it = jsonObject.keys();
172-
while (it.hasNext()) {
173-
String key = it.next();
174-
String value = jsonObject.getString(key);
175-
extrasMap.putString(key, value);
176-
}
177-
writableMap.putMap(JPushConstans.EXTRAS, extrasMap);
178-
} catch (Throwable throwable) {
179-
JPushLogger.w("convertExtras error:" + throwable.getMessage());
180-
}
103+
JPushHelper.sendEvent(JPushConstans.MOBILE_NUMBER_EVENT, writableMap);
181104
}
182105

183106
}

0 commit comments

Comments
 (0)