1. 程式人生 > >友盟分享和推送看這一篇就夠了

友盟分享和推送看這一篇就夠了

前段時間寫了一篇關於友盟推送的文章,從閱讀量來看,大家在這方面踩了很多坑,所以我覺得有必要來個全面的總結,給大家更好的過坑意見;

先從分享開始說吧

第一步整合SDK:官方文件說的很詳細了,整合大家就看文件吧,我就總結一下要注意的地方:

微信,qq,簡訊等友盟的api都有了,不過為了方便自己呼叫,可以自定義一個介面:

/**
 * Created by Administrator on 2018/1/5 0005.
 * 分享回撥
 */

public interface ShareHandler {

    void shareSuccess();

    void shareFailed(String msg);

    void shareCancel();

}
然後自定義一個分享的工具類
public class ShareUtils {

    private Activity mContext;

    public ShareUtils(Activity context) {
        mContext = context;
    }

    private ShareHandler mShareHandler;

    /**為方便引數的傳遞,把需要的引數封裝為一個shareBean
     * @param shareBean 分享引數類
     */
    public void beginShare(ShareBean shareBean, ShareHandler shareHandler) {
        mShareHandler = shareHandler;
        UMWeb shareUrl = new UMWeb(shareBean.getUrl());
        shareUrl.setTitle(shareBean.getTitle());
        shareUrl.setDescription(shareBean.getDesc());
        shareUrl.setThumb(new UMImage(mContext, R.mipmap.ic_launcher));
        new ShareAction(mContext)
                .withText(shareBean.getTitle())
                .withMedia(shareUrl)
                .setPlatform(shareBean.getType())
                .setCallback(shareListener)
                .share();

    }

    public UMShareListener shareListener = new UMShareListener() {
        /**
         * @descrption 分享開始的回撥
         * @param platform 平臺型別
         */
        @Override
        public void onStart(SHARE_MEDIA platform) {
//            ToastUtils.showShortToast("share start");
        }

        /**
         * @descrption 分享成功的回撥
         * @param platform 平臺型別
         */
        @Override
        public void onResult(SHARE_MEDIA platform) {
//            ToastUtils.showShortToast("share success");
            if (mShareHandler != null)
                mShareHandler.shareSuccess();
        }

        /**
         * @descrption 分享失敗的回撥
         * @param platform 平臺型別
         * @param t 錯誤原因
         */
        @Override
        public void onError(SHARE_MEDIA platform, Throwable t) {
//            ToastUtils.showShortToast("share failed" + t.getMessage());
            if (mShareHandler != null)
                mShareHandler.shareFailed(t.getMessage());
        }

        /**
         * @descrption 分享取消的回撥
         * @param platform 平臺型別
         */
        @Override
        public void onCancel(SHARE_MEDIA platform) {
//            ToastUtils.showShortToast("share calcel");
            if (mShareHandler != null)
                mShareHandler.shareCancel();
        }
    };
}

shareBean也就幾個引數
//分享 kotlin格式  不會kotlin的吧引數copy到自己的實體類即可
data class ShareBean(
        val type: SHARE_MEDIA, //QQ
        val url: String, //分享的Url
        val title: String, //標題
        val thumb: String, //圖片地址
        val desc: String //描述文字
)
工具類寫好了然後就是呼叫
private void share(SHARE_MEDIA platform) {
        ShareUtils shareUtils = new ShareUtils(InvitingFriendActivity.this);
        //這裡的引數除了都可以從伺服器獲取,然後賦值就行
        ShareBean shareBean = new ShareBean(platform, shareUrl, shareTitle, shareIcon, "");
        shareUtils.beginShare(shareBean, new ShareHandler() {
            @Override
            public void shareSuccess() {
//                ToastUtils.showShortToast("分享成功");
            }

            @Override
            public void shareFailed(String msg) {
//                ToastUtils.showShortToast("分享失敗:" + msg);
            }

            @Override
            public void shareCancel() {
//                ToastUtils.showShortToast("分享取消");
            }
        });
    }

    /**因為qq和qq空間6.0以後有許可權管理校驗,這一步是校驗,可以直接呼叫這個方法發起分享
     * @param paltform pingtai
     */
    public void checkPermissionToshare(final SHARE_MEDIA paltform) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //判斷該應用是否有寫SD卡許可權,如果沒有再去申請
            if (ContextCompat.checkSelfPermission(InvitingFriendActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                RxPermissions rxPermissions = new RxPermissions(this);
                rxPermissions
                        .request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        .subscribe(new Consumer<Boolean>() {
                            @Override
                            public void accept(Boolean aBoolean) throws Exception {
                                if (aBoolean) {
                                    share(paltform);
                                } else {
                                    ToastUtils.showShortToast("分享取消");
                                }
                            }
                        });
            } else {
                share(paltform);
            }
        }
    }

呼叫示例
  checkPermissionToshare(SHARE_MEDIA.QQ);
下面是通過gradle配置,不打包release版本apk測試微信和微信朋友圈分享的推薦方法
當我們在做微信微博sdk分享的時候除錯非常麻煩,因為要使用對應的簽名版本才能呼叫sdk成功。

當我們使用AndroidStudio的Gradle之後會很簡單的解決這個問題。

1.我們把簽名檔案放到工程根目錄下(這樣做是為了保持路徑的統一)

2.在Gradle中引入如下程式碼:

    //配置keystore簽名
    signingConfigs {
        release {
            storeFile file('F:/keystone/vc_secret_key/Keystore.jks')//把正式版簽名檔案儲存到本地磁碟,這裡寫入全路徑
            storePassword "xxxxxxxx"
            keyAlias "timehut team"
            keyPassword "xxxxxxxx"
        }
    }


    buildTypes {
        debug {
            signingConfig signingConfigs.release
        }
        release {
            signingConfig signingConfigs.release
        }
    }

只需要在debug的配置下使用release的配置就可以執行達到打包release版本的效果


為了出現問題解決不了,可以在application中啟用友盟的日誌提示,這樣有什麼問題會給你一個解決方案的連結
Config.DEBUG = true;//列印友盟分享日誌

然後是第三方登入授權獲取使用者資訊

private class InnerUMAuthListener implements UMAuthListener {
        /**
         * 授權開始的回撥
         *
         * @param platform 平臺名稱
         */
        @Override
        public void onStart(SHARE_MEDIA platform) {

        }

        /**
         * 授權成功的回撥
         *
         * @param platform 平臺名稱
         * @param action   行為序號,開發者用不上
         * @param data     使用者資料返回
         */
        @Override
        public void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {
            if (data != null) {
                String city = data.get("city");
                String country = data.get("country");
                String iconurl = data.get("iconurl");
                String language = data.get("language");
                String name = data.get("name");
                String openid = data.get("openid");
                String province = data.get("province");
                String gender = data.get("gender");
                String unionid = data.get("unionid");
                //拿到資訊去請求登入介面。。。
                mPresenter.bindWeixin(city, country, iconurl, language, name, openid, province, gender.equals("男") ? 1 : 2, unionid);
            }
        }

        /**
         * 授權失敗的回撥
         *
         * @param platform 平臺名稱
         * @param action   行為序號,開發者用不上
         * @param t        錯誤原因
         */
        @Override
        public void onError(SHARE_MEDIA platform, int action, Throwable t) {
            showToast("微信登陸失敗!" + t.getMessage());
        }

        /**
         * 授權取消的回撥
         *
         * @param platform 平臺名稱
         * @param action   行為序號,開發者用不上
         */
        @Override
        public void onCancel(SHARE_MEDIA platform, int action) {

        }
    }
授權呼叫
mShareAPI.getPlatformInfo(this, SHARE_MEDIA.WEIXIN, new InnerUMAuthListener());
刪除授權呼叫
 mShareAPI.deleteOauth(this, SHARE_MEDIA.WEIXIN, new InnerUMAuthListener());




《***************************分享就是這麼多,相對分享推送的需要講的東西比較多*****************************》

裡面提供了推送的一個工具類,現在給它完善一下,然後再講講推送要注意的地方


/**
 * 完善後的友盟推送類
 */
public class UmengHelper {

    private static final String TAG = "UmengHelper";
    public static final String UPDATE_STATUS_ACTION = "com.umeng.message.example.action.UPDATE_STATUS";
    private static UmengHelper mUmengHelper;
    private NotificationManager mNotificationManager;
    private static String USER_ALIAS_KEY = "WEIC_ALIAS";
    private static String USER_ALIAS_VALUE = "userId_";
    public static String LOGING_TAG = "log_on";
    public static String BID_TAG = "bid";

    public static UmengHelper getInstance() {
        if (mUmengHelper == null) {
            mUmengHelper = new UmengHelper();
        }
        return mUmengHelper;
    }

    public void init() {
        mNotificationManager = (NotificationManager) ContextUtils.getContext().getSystemService(Context.NOTIFICATION_SERVICE);
        PushAgent mPushAgent = PushAgent.getInstance(ContextUtils.getContext());
        //註冊推送服務,每次呼叫register方法都會回撥該介面
        UMConfigure.setLogEnabled(true);
        mPushAgent.setNotificationPlaySound(MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE);
        mPushAgent.register(new IUmengRegisterCallback() {
            @Override
            public void onSuccess(String deviceToken) {
                //註冊成功會返回device token
                Log.d(TAG, "onSuccess: deviceToken----" + deviceToken);
                ContextUtils.getContext().sendBroadcast(new Intent(UPDATE_STATUS_ACTION));
            }

            @Override
            public void onFailure(String s, String s1) {
                Log.d(TAG, "onFailure: ---" + s + "     s1--" + s1);
                ContextUtils.getContext().sendBroadcast(new Intent(UPDATE_STATUS_ACTION));
            }
        });
        UMConfigure.init(ContextUtils.getContext(), "", "", UMConfigure.DEVICE_TYPE_PHONE, "");

        setMessageHandler();
        setNotificationClickHandler();
    }

    public static void startPushAgent() {
        PushAgent.getInstance(ContextUtils.getContext()).onAppStart();
    }

    /**
     * 設定使用者別名
     */
    public static void setUserAlias(long user_id) {
        //設定使用者id和device_token的一對多的對映關係:
        PushAgent.getInstance(ContextUtils.getContext()).addAlias(USER_ALIAS_VALUE + user_id, USER_ALIAS_KEY, new UTrack.ICallBack() {
            @Override
            public void onMessage(boolean isSuccess, String message) {
                Log.d(TAG, "設定別名" + isSuccess + "     別名--" + message);
            }
        });
    }

    public static void delUserAlias() {
        long userid = BaseApplication.getInstance().getUser() == null ? 0 : BaseApplication.getInstance().getUser().getUser_id();
        PushAgent.getInstance(ContextUtils.getContext()).deleteAlias(USER_ALIAS_VALUE + userid, USER_ALIAS_KEY, new UTrack.ICallBack() {
            @Override
            public void onMessage(boolean b, String s) {
                LogUtils.e("刪除別名..." + b + "刪除結果..." + s);
            }
        });
    }

    /**
     * 設定使用者標籤  通常是使用者登入了或者有其他操作才呼叫此方法設定標籤
     */
    public static void setUserTag(String... var2) {
        PushAgent.getInstance(ContextUtils.getContext()).getTagManager().addTags(new TagManager.TCallBack() {

            @Override
            public void onMessage(final boolean isSuccess, final ITagManager.Result result) {
                //isSuccess表示操作是否成功
                Log.e(TAG, "新增標籤" + isSuccess);
            }
        }, var2);
    }

    public static void delUserTag() {
        PushAgent.getInstance(ContextUtils.getContext()).getTagManager().deleteTags(new TagManager.TCallBack() {
            @Override
            public void onMessage(boolean b, ITagManager.Result result) {
                Log.e(TAG, "刪除標籤" + b);
            }
        }, LOGING_TAG, BID_TAG);
    }

    public void setMessageHandler() {
        UmengMessageHandler messageHandler = new UmengMessageHandler() {
            @Override
            public void dealWithCustomMessage(final Context context, final UMessage msg) {
                Log.e(TAG, "dealWithCustomAction msg=" + msg.toString() + ", msg.custom=" + msg.text);
                new Handler(context.getMainLooper()).post(new Runnable() {

                    @Override
                    public void run() {
                        // 對自定義訊息的處理方式,點選或者忽略
                        boolean isClickOrDismissed = true;
                        if (isClickOrDismissed) {
                            //自定義訊息的點選統計
                            UTrack.getInstance(ContextUtils.getContext()).trackMsgClick(msg);
                        } else {
                            //自定義訊息的忽略統計
                            UTrack.getInstance(ContextUtils.getContext()).trackMsgDismissed(msg);
                        }
                    }
                });
            }

            @Override
            public void dealWithNotificationMessage(Context context, UMessage uMessage) {
                super.dealWithNotificationMessage(context, uMessage);
            }


            @Override
            public Notification getNotification(Context context, UMessage msg) {
                Log.e(TAG, "dealWithCustomAction msg=" + msg.toString() + ", msg.custom=" + msg.text);
                if (msg.extra != null) {
                    String url = msg.extra.get("weic");
                    // TODO: 2018/1/29 根據自定義引數跳轉activity
                }
                sendTenNotifications(msg, context);//有時候官方demo的通知不好用,自己寫一個,switch裡面給它返回一個就行
                switch (msg.builder_id) {
                    case 1:
                        Notification.Builder builder = new Notification.Builder(context);
                        return builder.build();
                    default:
                        //預設為0,若填寫的builder_id並不存在,也使用預設。
                        return super.getNotification(context, msg);
                }
            }
        };
        PushAgent.getInstance(ContextUtils.getContext()).setMessageHandler(messageHandler);
    }

    /**
     * 傳送通知  預設的通知欄樣式
     */
    private void sendTenNotifications(UMessage msg, Context context) {
        Intent intent = new Intent();
        intent.setClassName(context, "需要開啟的activity全路徑");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(ContextUtils.getContext())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(msg.title)
                .setContentText(msg.text)
                .setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));
        mNotificationManager.notify(1, builder.build());
    }

    /**
     * 自定義行為的回撥處理,參考文件:高階功能-通知的展示及提醒-自定義通知開啟動作
     * UmengNotificationClickHandler是在BroadcastReceiver中被呼叫,故
     * 如果需啟動Activity,需新增Intent.FLAG_ACTIVITY_NEW_TASK
     */
    public void setNotificationClickHandler() {
        /**
         * 該Handler是在BroadcastReceiver中被呼叫,故
         * 如果需啟動Activity,需新增Intent.FLAG_ACTIVITY_NEW_TASK
         * */
        UmengNotificationClickHandler notificationClickHandler = new UmengNotificationClickHandler() {
            @Override
            public void dealWithCustomAction(Context context, UMessage msg) {
                Log.e(TAG, "dealWithCustomAction msg=" + msg.toString() + ", msg.custom=" + msg.custom);
                startActivity(context);
            }

            @Override
            public void launchApp(Context context, UMessage msg) {
                Log.e(TAG, "launchApp msg=" + msg.toString() + ", msg.custom=" + msg.custom);
                if (msg.extra != null) {
                    String url = msg.extra.get("weic");
                    // TODO: 2018/1/29 根據自定義引數跳轉activity
                }
                super.launchApp(context, msg);
            }

            @Override
            public void openUrl(Context context, UMessage msg) {
                Log.e(TAG, "openUrl msg=" + msg.toString() + ", msg.custom=" + msg.custom);
                super.openUrl(context, msg);
            }

            @Override
            public void openActivity(Context context, UMessage msg) {
                Log.e(TAG, "openActivity msg=" + msg.toString() + ", msg.custom=" + msg.custom);
            }
        };
        PushAgent.getInstance(ContextUtils.getContext()).setNotificationClickHandler(notificationClickHandler);
    }

    private void startActivity(Context context) {
        Intent i = new Intent();
        i.setAction(Intent.ACTION_MAIN);
        i.addCategory(Intent.CATEGORY_LAUNCHER);
        i.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);//如友盟官方的註釋所說,如果點選訊息要做頁面跳轉需要新增這個標誌
        i.setComponent(new ComponentName("專案包名", "需要開啟的activity的全路徑"));
        context.startActivity(i);
    }

    private void getAppInfo() {
        String pkgName = ContextUtils.getContext().getPackageName();
        String info = String.format("DeviceToken:%s\n" + "SdkVersion:%s\nAppVersionCode:%s\nAppVersionName:%s",
                PushAgent.getInstance(ContextUtils.getContext()).getRegistrationId(), MsgConstant.SDK_VERSION,
                UmengMessageDeviceConfig.getAppVersionCode(ContextUtils.getContext()), UmengMessageDeviceConfig.getAppVersionName(ContextUtils.getContext()));
        Log.d(TAG, "應用包名:" + pkgName + "\n" + info);
    }
}

然後還有個小米,華為,魅族的離線通道
/**
 * Created by Administrator on 2017/11/23 0023.
 * 小米彈窗功能
 * 小米對後臺程序做了諸多限制。若使用一鍵清理,應用的channel程序被清除,將接收不到推送。
 * 為了增加推送的送達率,可選擇接入小米託管彈窗功能。通知將由小米系統託管彈出,
 * 點選通知欄將跳轉到指定的Activity。該Activity需繼承自UmengNotifyClickActivity,
 * 同時實現父類的onMessage方法,對該方法的intent引數進一步解析即可,該方法非同步呼叫,不阻塞主執行緒
 */

public class MipushDialogActivity extends UmengNotifyClickActivity {

    private static String TAG = MipushDialogActivity.class.getName();
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.notification_view);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Log.e(TAG, "onNewIntent: " + intent);
    }


    @Override
    public void onMessage(Intent intent) {
        super.onMessage(intent);  //此方法必須呼叫,否則無法統計開啟數
        String body = intent.getStringExtra(AgooConstants.MESSAGE_BODY);
        Log.e(TAG, "onMessage: " + body);
        Message message = Message.obtain();
        message.obj = body;
        handler.sendMessage(message);
    }
}
下面這個實體類是在onMessage中獲取到的body
/**
 * Created by Administrator on 2018/1/29.
 * 離線通知實體類
 */

data class PushInfo(
		val display_type: String, //notification  推送訊息型別
		val extra: Extra,
		val msg_id: String, //uuapugn151720757171510  推送訊息的id
		val body: Body,
		val random_min: Int //0
)
//自定義引數  可根據此引數做頁面跳轉
data class Extra(
		val url: String //"mainActivity"  key為url-->value為mainActivity
)

data class Body(
		val after_open: String, //go_app  點選推送訊息開啟應用後的行為描述 go_qpp(啟動應用) go_custom(自定義行為) go_activity(開啟指定頁面) go_url(開啟指定連結)
		val play_lights: String, //false 是否亮燈(手機訊息呼吸燈)
		val ticker: String, //惺惺惜惺惺
		val play_vibrate: String, //false
		val custom: String, //自定義行為的value
		val activity: String,//activity的全路徑
		val url: String, //連結地址
		val text: String, //阿德法阿薩德  內容
		val title: String, //惺惺惜惺惺   標題
		val play_sound: Boolean //true   是否播放聲音
)
manifest配置
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxx">

    <permission
        android:name="${applicationId}.permission.MIPUSH_RECEIVE"
        android:protectionLevel="signatureOrSystem" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_ADDED" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_CHANGED" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_INSTALL" />
    <uses-permission android:name="android.permission.BROADCAST_PACKAGE_REPLACED" />
    <uses-permission android:name="android.permission.RESTART_PACKAGES" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="${applicationId}.permission.MIPUSH_RECEIVE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <!-- 相容flyme5.0以下版本,魅族內部整合pushSDK必填,不然無法收到訊息 -->
    <uses-permission android:name="com.meizu.flyme.push.permission.RECEIVE" />
    <permission
        android:name="${applicationId}.push.permission.MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="${applicationId}.push.permission.MESSAGE" />

    <!-- 相容flyme3.0配置許可權 -->
    <uses-permission android:name="com.meizu.c2dm.permission.RECEIVE" />
    <permission
        android:name="${applicationId}.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
    <!--LinkedME SDK 需要開啟的許可權-->  <!--LinkedME SDK 需要開啟的許可權-->
    <uses-permission android:name="android.permission.BLUETOOTH" />

    <application>

        <service
            android:name="com.taobao.accs.ChannelService"
            android:exported="true"
            android:process=":channel">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.SERVICE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.ELECTION" />
            </intent-filter>
        </service>

        <service
            android:name="com.taobao.accs.data.MsgDistributeService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.RECEIVE" />
            </intent-filter>
        </service>

        <receiver
            android:name="com.taobao.accs.EventReceiver"
            android:process=":channel">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>

        <receiver
            android:name="com.taobao.accs.ServiceReceiver"
            android:process=":channel">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.COMMAND" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.START_FROM_AGOO" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.taobao.accs.internal.AccsJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":channel" />

        <service
            android:name="com.taobao.accs.ChannelService$KernelService"
            android:process=":channel" />

        <service
            android:name="org.android.agoo.accs.AgooService"
            android:exported="true">
            <intent-filter>
                <action android:name="com.taobao.accs.intent.action.RECEIVE" />
            </intent-filter>
        </service>

        <service
            android:name="com.umeng.message.UmengIntentService"
            android:exported="true"
            android:process=":channel">
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.RECEIVE" />
            </intent-filter>
        </service>

        <service
            android:name="com.umeng.message.XiaomiIntentService"
            android:exported="true"
            android:process=":channel">
            <intent-filter>
                <action android:name="org.agoo.android.intent.action.RECEIVE" />
            </intent-filter>
        </service>

        <receiver
            android:name="com.taobao.agoo.AgooCommondReceiver"
            android:exported="true"
            android:process=":channel">
            <intent-filter>
                <action android:name="${applicationId}.intent.action.COMMAND" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.umeng.message.UmengMessageIntentReceiverService"
            android:exported="true"
            android:process=":channel">
            <intent-filter>
                <action android:name="org.android.agoo.client.MessageReceiverService" />
            </intent-filter>
        </service>

        <receiver
            android:name="com.umeng.message.NotificationProxyBroadcastReceiver"
            android:exported="false" />

        <service
            android:name="com.umeng.message.UmengMessageCallbackHandlerService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.umeng.messge.registercallback.action" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.enablecallback.action" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.disablecallback.action" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.message.handler.action" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.umeng.message.message.sendmessage.action" />
            </intent-filter>
        </service>

        <service
            android:name="com.umeng.message.UmengDownloadResourceService"
            android:exported="false" />

        <provider
            android:name="com.umeng.message.provider.MessageProvider"
            android:authorities="${applicationId}.umeng.message"
            android:exported="false">
            <grant-uri-permission android:pathPattern=".*" />
        </provider>

        <!-- mipush -->
        <service
            android:name="com.xiaomi.mipush.sdk.PushMessageHandler"
            android:enabled="true"
            android:exported="true" />

        <service
            android:name="com.xiaomi.mipush.sdk.MessageHandleService"
            android:enabled="true" />

        <receiver
            android:name="org.android.agoo.xiaomi.MiPushBroadcastReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="com.xiaomi.mipush.RECEIVE_MESSAGE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.xiaomi.mipush.ERROR" />
            </intent-filter>
        </receiver>

        <!-- huawei push -->
        <receiver android:name="org.android.agoo.huawei.HuaWeiReceiver">
            <intent-filter>
                <action android:name="com.huawei.android.push.intent.REGISTRATION" />
                <action android:name="com.huawei.android.push.intent.RECEIVE" />
                <action android:name="com.huawei.intent.action.PUSH" />
                <action android:name="com.huawei.intent.action.PUSH_STATE" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

        <meta-data
            android:name="UMENG_APPKEY"
            android:value="${UMENG_APPKEY}" />

        <meta-data
            android:name="UMENG_MESSAGE_SECRET"
            android:value="${UMENG_MESSAGE_SECRET}" />

        <!-- 小米華為推送配置 -->
        <activity
            android:name="com.jinzaofintech.investlib.MipushDialogActivity"
            android:exported="true"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="myscheme" />
            </intent-filter>
        </activity>

        <receiver
            android:name="com.meizu.cloud.pushsdk.SystemReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.meizu.cloud.pushservice.action.PUSH_SERVICE_START" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

        <!-- meizu push -->
        <service
            android:name="com.meizu.cloud.pushsdk.NotificationService"
            android:exported="true" />
    </application>
</manifest>
推送的專案結構圖如下

推送程式碼相關的總共就這些東西了。jar包so檔案從sdk中copy就行了

下面講坑

基本百分之九十以上的問題這幾個連結都能解決了,還有一些解決不了,我恰好知道的下面給說一下 主要是幾個方面吧
  1. 奔潰有可能引起的因素,少了某個資原始檔,有可能是圖片,string檔案裡面的文字,比如第三方登入授權要獲取使用者資訊的時候需要這兩個資源
       <string name="umeng_socialize_female">女</string>
        <string name="umeng_socialize_male">男</string>
  2. 有時候是佈局寫錯了,比如log能看到推送訊息,但是訊息通知欄不顯示notification,如果用了自定義notification的話建議檢查一下佈局,然後需要設定大小圖片 myNotificationView.setImageViewBitmap(R.id.notification_large_icon, getLargeIcon(context, msg));                      myNotificationView.setImageViewResource(R.id.notification_small_icon, getSmallIconId(context, msg));要記得給上匹配名字的圖片
  3. 包名是否和友盟後臺的一致,ID這些
  4. 沒辦法的辦法就是去找友盟客服了,基本通過這些方法都能解決掉你的問題了,還不行你就在下方留言,大家一起商討