我已经在我的应用中实现了Onesignal Push通知,但是当我的应用关闭时,我没有收到推送通知。这是我的实施代码。
LoginActivity.java
public class LoginActivity extends BaseActivity {
private static final int REQUEST_MARK_READ = 165;
private ListView userListView;
private static final String TAG = LoginActivity.class.getSimpleName();
private static ArrayList<String> userids=new ArrayList<>();
private static boolean activityStarted;
public static void start(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (activityStarted && getIntent() != null && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0)
{
finish();
return;
}
activityStarted = true;
setContentView(R.layout.activity_login);
if (SharedPreferencesUtil.hasQbUser()) {
try {
Onesignal();
recreateChatSession();
} catch (Exception e) {
e.printStackTrace();
}
return;
}
Onesignal();
userListView = _findViewById(R.id.list_login_users);
TextView listHeader = (TextView) LayoutInflater.from(this)
.inflate(R.layout.include_list_hint_header, userListView, false);
listHeader.setText(R.string.login_select_user_for_login);
userListView.addHeaderView(listHeader, null, false);
userListView.setOnItemClickListener(new OnUserLoginItemClickListener());
buildUsersList();
}
public void Onesignal()
{
/*5 oct 2016*/
OneSignal.idsAvailable(new OneSignal.IdsAvailableHandler() {
@Override
public void idsAvailable(String userId, String registrationId) {
registrationId= NotificationUtilities.getRegistrationId(getApplicationContext());
userids.add(userId);
String text = "OneSignal UserID:\n" + userId + "\n\n";
// try {
// OneSignal.postNotification(new JSONObject("{'contents': {'en':'"+ PrivateChatImpl.chat_message +"'}, 'include_player_ids': ['" + userId + "']}"), null);
// } catch (JSONException e) {
// e.printStackTrace();
// }
try {
OneSignal.postNotification(new JSONObject("{'contents': {'en':'" + PrivateChatImpl.chat_message.size() + "','en':'Unread Messages'}, 'include_player_ids': ['" + userId + "']}"),
new OneSignal.PostNotificationResponseHandler() {
@Override
public void onSuccess(JSONObject response) {
Log.i("OneSignalExample", "postNotification Success: " + JsonResponse());
}
@Override
public void onFailure(JSONObject response) {
Log.e("OneSignalExample", "postNotification Failure: " + JsonResponse());
}
});
} catch (JSONException e) {
e.printStackTrace();
}
if (registrationId != null)
text += "Google Registration Id:\n" + registrationId;
else
text += "Google Registration Id:\nCould not subscribe for push";
}
});
/*5 oct 2016*/
}
public String JsonResponse()
{
String jsonResponse = null;
try {
URL url = new URL("https://onesignal.com/api/v1/notifications");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setUseCaches(false);
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setRequestProperty("Authorization", "Basic NGEwMGZmMjItY2NkNy0xMWUzLTk5ZDUtMDAwYzI5NDBlNjJj");
con.setRequestMethod("POST");
String strJsonBody = "{"
+ "\"app_id\": \"05b29c2d-ea2a-487f-88e8-63438bd58831\","
+ "\"include_player_ids\": "+userids+","
+ "\"data\": {\"foo\": \"bar\"},"
+ "\"contents\": {\"en\": \"English Message\"}"
+ "}";
System.out.println("strJsonBody:\n" + strJsonBody);
byte[] sendBytes = strJsonBody.getBytes("UTF-8");
con.setFixedLengthStreamingMode(sendBytes.length);
OutputStream outputStream = con.getOutputStream();
outputStream.write(sendBytes);
int httpResponse = con.getResponseCode();
System.out.println("httpResponse: " + httpResponse);
if ( httpResponse >= HttpURLConnection.HTTP_OK
&& httpResponse < HttpURLConnection.HTTP_BAD_REQUEST) {
Scanner scanner = new Scanner(con.getInputStream(), "UTF-8");
jsonResponse = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
scanner.close();
}
else {
Scanner scanner = new Scanner(con.getErrorStream(), "UTF-8");
jsonResponse = scanner.useDelimiter("\\A").hasNext() ? scanner.next() : "";
scanner.close();
}
System.out.println("jsonResponse:\n" + jsonResponse);
} catch(Throwable t) {
t.printStackTrace();
}
return jsonResponse;
}
MyShopApplication.java
public class MyShopApplication extends Application {
private Tracker mTracker;
private static MyShopApplication INSTANCE;
final GooglePlayServicesHelper googlePlayServicesHelper = new GooglePlayServicesHelper();
@Override
public void onCreate() {
super.onCreate();
INSTANCE=this;
HttpService.getInstance().setUp(getApplicationContext());
FacebookSdk.sdkInitialize(getApplicationContext());
sharedPreferences = getSharedPreferences(AppConstants.USER_PREFERENCES, Context.MODE_PRIVATE);
// OneSignal.startInit(this).init();
// OneSignal.enableNotificationsWhenActive(true);
// OneSignal.setLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.DEBUG);
/* 5 october 2016 */
// OneSignal.setLogLevel(OneSignal.LOG_LEVEL.DEBUG, OneSignal.LOG_LEVEL.WARN);
OneSignal.startInit(this)
.setNotificationOpenedHandler(new ExampleNotificationOpenedHandler())
.setNotificationReceivedHandler(new ExampleNotificationReceivedHandler())
.autoPromptLocation(true)
.inFocusDisplaying(OneSignal.OSInFocusDisplayOption.None)
.disableGmsMissingPrompt(true)
.init();
/*11 oct 2016*/
OneSignal.clearOneSignalNotifications();
OneSignal.syncHashedEmail(sharedPreferences.getString(AppConstants.USER_EMAIL, ""));
/*11 oct 2016*/
/*Registering for push notifications happens automatically on Android using OneSignal.
You don't need to write anything!*/
/* 5 oct 2016*/
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder()/*.disabled(BuildConfig.DEBUG)*/.build())
.build();
Fabric.with(this, crashlyticsKit, new Crashlytics(), new Crashlytics());
GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
analytics.setLocalDispatchPeriod(15);//setting dispatching to 15mins, Default is 30 mins
// To enable debug logging use: adb shell setprop log.tag.GAv4 DEBUG
mTracker = analytics.newTracker(R.xml.global_tracker);
mTracker.enableAutoActivityTracking(true);
}
/* 5 october 2016 */
private class ExampleNotificationOpenedHandler implements OneSignal.NotificationOpenedHandler {
// This fires when a notification is opened by tapping on it.
@Override
public void notificationOpened(OSNotificationOpenResult result) {
OSNotificationAction.ActionType actionType = result.action.type;
JSONObject data = result.notification.payload.additionalData;
String customKey;
if (data != null) {
customKey = data.optString("customkey", null);
if (customKey != null)
Log.i("OneSignalExample", "customkey set with value: " + customKey);
}
if (actionType == OSNotificationAction.ActionType.ActionTaken)
Log.i("OneSignalExample", "Button pressed with id: " + result.action.actionID);
// The following can be used to open an Activity of your choice.
Intent intent = new Intent(getApplicationContext(),
com.baniaclothing.rang.quickblox.ui.activity.LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
// Add the following to your AndroidManifest.xml to prevent the launching of your main Activity
// if you are calling startActivity above.
/*
<application ...>
<meta-data android:name="com.onesignal.NotificationOpened.DEFAULT" android:value="DISABLE" />
</application>
*/
}
}
/* 5 october 2016 */
/* 5 october 2016 */
private class ExampleNotificationReceivedHandler implements OneSignal.NotificationReceivedHandler {
@Override
public void notificationReceived(OSNotification notification) {
JSONObject data = notification.payload.additionalData;
String customKey;
if (data != null) {
customKey = data.optString("customkey", null);
if (customKey != null)
Log.i("OneSignalExample", "customkey set with value: " + customKey);
}
}
}
/* 5 october 2016 */
}
当我点击通知时,我的LoginActivity.java就会启动,当我打开我的应用程序时,会显示通知,但是当我关闭我的应用程序时,没有显示任何通知。
Manifest_file
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.baniaclothing.rang" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Creates a custom permission so only this app can receive its messages. -->
<permission
android:name="com.baniaclothing.rang.quickblox.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.baniaclothing.rang.permission.C2D_MESSAGE" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<application
android:name=".MyShopApplication"
android:allowBackup="true"
android:icon="@mipmap/app_icon"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.onesignal.BadgeCount"
android:value="DISABLE" />
<meta-data
android:name="com.onesignal.NotificationOpened.DEFAULT"
android:value="DISABLE" />
<activity
android:name=".quickblox.ui.activity.LoginActivity"
android:label="@string/login_title"
android:screenOrientation="portrait" />
<service
android:name=".NotificationExtenderExample"
android:exported="false">
<intent-filter>
<action android:name="com.onesignal.NotificationExtender" />
</intent-filter>
</service>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
</manifest>
NotificationExtenderExample
public class NotificationExtenderExample extends NotificationExtenderService {
final static String GROUP_KEY_EMAILS = "group_key_emails";
@Override
protected boolean onNotificationProcessing(OSNotificationReceivedResult receivedResult) {
OverrideSettings overrideSettings = new OverrideSettings();
overrideSettings.extender = new NotificationCompat.Extender() {
@Override
public NotificationCompat.Builder extend(NotificationCompat.Builder builder) {
// Sets the background notification color to Green on Android 5.0+ devices.
return builder.setColor(new BigInteger("FF00FF00", 16).intValue())
.setGroup(GROUP_KEY_EMAILS)
.setGroupSummary(true);
}
};
OSNotificationDisplayedResult displayedResult = displayNotification(overrideSettings);
Log.d("OneSignalExample", "Notification displayed with id: " + displayedResult.androidNotificationId);
return true;
}
}
logcat的
10-14 08:56:55.683 4581-4581/com.baniaclothing.rang I/REgistraationId:: dKV-blhGGI4:APA91bFpbOMERKf_IlZ3JI9P2ngOY5EXFF7kaUyuuHSL1SGsi5qLPDGDoyJPKyA1OvK5Jd_4TfHjWQJjO-SqQY5g7tTY2ThGOusbBJwH-8-IDhxsqYeUJzvfQtJl8cvW9qOhsnTnswp7
10-14 08:56:56.287 4581-6086/com.baniaclothing.rang I/System.out: strJsonBody:
10-14 08:56:56.287 4581-6086/com.baniaclothing.rang I/System.out: {"app_id": "000000000-0000-0000-0000-0000000000","include_player_ids": [ecbef570-f713-4fb0-ada2-e7b9b864344b],"data": {"foo": "bar"},"contents": {"en": "English Message"}}
10-14 08:56:56.686 4581-6086/com.baniaclothing.rang I/System.out: httpResponse: 400
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/System.out: jsonResponse:
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/System.out: {"status":400,"error":"There was a problem in the JSON you submitted: unexpected character at line 1, column 74 [parse.c:652]"}
10-14 08:56:56.692 4581-6086/com.baniaclothing.rang I/OneSignalExample: postNotification Success: {"status":400,"error":"There was a problem in the JSON you submitted: unexpected character at line 1, column 74 [parse.c:652]"}
注意 - 请忽略java文件中不必要的方法调用。我刚刚显示了与OneSignal推送通知相关的代码。 为什么我的应用关闭时无法收到通知?
答案 0 :(得分:2)
如果您通过将应用程序置于“强制停止”状态来关闭应用程序,则不会收到包括推送通知的GCM / FCM消息在内的大多数事件。可以通过以下方式将应用程序置于此状态。
要确认您的应用状态是问题,请发送一些通知并检查以下GCM logcat条目。
W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.onesignal.example (has extras) }
某些设备制造商将白名单应用程序进入强制关闭状态。例如Gmail和Whatsapp。
有关详细信息,请参阅OneSignal's documentation。