如何在应用关闭时获取OneSignal Push Notfications?

时间:2016-10-13 15:42:08

标签: android push-notification onesignal

我已经在我的应用中实现了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推送通知相关的代码。 为什么我的应用关闭时无法收到通知?

1 个答案:

答案 0 :(得分:2)

如果您通过将应用程序置于“强制停止”状态来关闭应用程序,则不会收到包括推送通知的GCM / FCM消息在内的大多数事件。可以通过以下方式将应用程序置于此状态。

  • 来自设置&gt;应用程序,“强制停止”被按下。
  • 长按某些设备上的后退按钮。
  • 使用像Greenify这样的第三方任务杀手。
  • 由于他们的自定义Android调整,某些华为,小米或索尼设备已关闭应用程序。可以更改以下设备设置以防止这种情况发生。
    • 华为 - 转到设置&gt; “受保护的应用”,请检查您的应用。
    • 小米 - 确保在设置中为您的应用启用“自动启动”属性。
    • Sony - 点击电池图标。转到电源管理&gt; STAMINA模式&gt;待机状态的应用&gt;添加您的应用。

要确认您的应用状态是问题,请发送一些通知并检查以下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