極光推送實現鎖屏推送以及推送給指定的人

極光推送的配置,在官方文檔中已經很詳細地描述了;有手動導入跟jcenter導入兩種方式,推薦使用jcenter;

//在gradle中添加
android {
    ......
    defaultConfig {
        applicationId "com.xxx.xxx" //JPush上註冊的包名.
        ......

        ndk {
            //選擇要添加的對應cpu類型的.so庫。 
            abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a' 
            // 還可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }

        manifestPlaceholders = [
            JPUSH_PKGNAME : applicationId,
            JPUSH_APPKEY : "你的appkey", //JPush上註冊的包名對應的appkey.
            JPUSH_CHANNEL : "developer-default", //暫時填寫默認值即可.
        ]
        ......
    }
    ......
}

dependencis {
    ......

    compile 'cn.jiguang:jpush:2.1.8'  // 此處以SDK 2.1.8版本爲例

    ......
}

下載官方的Demo,將裏面的三個文件引入到自己的工程中;

這裏寫圖片描述

然後,在啓動界面註冊極光推送,同時也可以修改默認的通知欄樣式;

  // 初始化 JPush。如果已經初始化,但沒有登錄成功,則執行重新登錄。
    private void initm() {
        JPushInterface.init(getApplicationContext());
    }


    //for receive customer msg from jpush server
    private MessageReceiver mMessageReceiver;
    public static final String MESSAGE_RECEIVED_ACTION = "com.zerom.clothesnews.MESSAGE_RECEIVED_ACTION";
    public static final String KEY_TITLE = "title";
    public static final String KEY_MESSAGE = "message";
    public static final String KEY_EXTRAS = "extras";

    public void registerMessageReceiver() {
        mMessageReceiver = new MessageReceiver();
        IntentFilter filter = new IntentFilter();
        filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        filter.addAction(MESSAGE_RECEIVED_ACTION);
        registerReceiver(mMessageReceiver, filter);
    }


    public class MessageReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
                String messge = intent.getStringExtra(KEY_MESSAGE);
                String extras = intent.getStringExtra(KEY_EXTRAS);
                StringBuilder showMsg = new StringBuilder();
                showMsg.append(KEY_MESSAGE + " : " + messge + "\n");
                if (!JpushUtil.isEmpty(extras)) {
                    showMsg.append(KEY_EXTRAS + " : " + extras + "\n");
                }
            }
        }
    }

    public static void setNotification() {
        CustomPushNotificationBuilder builder = new CustomPushNotificationBuilder(
                MyApplication.getAppContext(),
                R.layout.layout_notification, R.id.icon, R.id.title,
                R.id.text);
        builder.layoutIconDrawable = R.mipmap.ic_launcher;
        builder.developerArg0 = "developerArg2";
        JPushInterface.setPushNotificationBuilder(2, builder);
    }

如果自己搭建後臺服務器的話,需要設定一個字段,作爲後天的識別;

 JpushUtil.setAlias(context, "給後臺的字段");

在JpushReceiver中可以對接收到的後臺字段進行處理,比如說識別到是信息中心的字段就跳到信息中心,商品字段就跳到商品界面等等;

//接收到的後臺的返回數據
 String type = bundle.getString(JPushInterface.EXTRA_EXTRA);

還有一種情況,就是推送的時候需要推送給特定的人,而不是所有的人;首先,在JpushUtil中添加多一個方法;

public static void setAliasAndTag(Context context, Set<String> tag) {
        TagAliasCallback tagAliasCallback = new TagAliasCallback() {
            @Override
            public void gotResult(int i, String s, Set<String> set) {

            }
        };
        JPushInterface.setAliasAndTags(context, null, tag, tagAliasCallback);
    }

然後把每個用戶的特定值設置爲Tag,比如說我的app用的是用戶id作爲TAG,所以我在用戶登錄成功之後,則把用戶ID設置爲TAG,到時候後臺根據TAG,也就是用戶ID就可以推送給指定的人了;

            Set<String> set = new HashSet<>();
            String Tag = resultsBean.getUserid() + "";
            set.add(Tag);
            JpushUtil.setAliasAndTag(context, set);

做完上面的操作,就能接收到推送消息了,但是,有時候會發現,當我們把APP後臺或者手機鎖屏的時候,就收不到推送的消息了;解決辦法很簡單,因爲極光推送是通過BroadcastReceiver調起通知欄的,所以只要動態註冊BroadcastReceiver即可實現APP在後臺運行的時候也能收到推送消息,而動態註冊的方法則是通過新建一個Service,啓動Service,通過Service動態註冊BroadcastReceiver;

public class RegisterService extends Service {

    public static boolean isForeground = false;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        isForeground = true;
        initm();
        registerMessageReceiver();
        JpushUtil.setAlias(this, "normal");
        WelcomeActivity.setNotification();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent localIntent = new Intent();
        localIntent.setClass(this, RegisterService.class);
        this.startService(localIntent);
    }

    // 初始化 JPush。如果已經初始化,但沒有登錄成功,則執行重新登錄。
    private void initm() {
        JPushInterface.init(getApplicationContext());
    }

    private MessageReceiver mMessageReceiver;
    public static final String MESSAGE_RECEIVED_ACTION = "com.taorouw.MESSAGE_RECEIVED_ACTION";
    public static final String KEY_TITLE = "title";
    public static final String KEY_MESSAGE = "message";
    public static final String KEY_EXTRAS = "extras";

    public void registerMessageReceiver() {
        mMessageReceiver = new MessageReceiver();
        IntentFilter filter = new IntentFilter();
        filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        filter.addAction(MESSAGE_RECEIVED_ACTION);
        registerReceiver(mMessageReceiver, filter);
    }


    public class MessageReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (MESSAGE_RECEIVED_ACTION.equals(intent.getAction())) {
                String messge = intent.getStringExtra(KEY_MESSAGE);
                String extras = intent.getStringExtra(KEY_EXTRAS);
                StringBuilder showMsg = new StringBuilder();
                showMsg.append(KEY_MESSAGE + " : " + messge + "\n");
                if (!JpushUtil.isEmpty(extras)) {
                    showMsg.append(KEY_EXTRAS + " : " + extras + "\n");
                }
            }
        }
    }

}

最後在AndroidManifest中註冊Service,並在啓動界面啓動Service;

startService(new Intent(WelcomeActivity.this, RegisterService.class));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章