美文网首页
极光推送的集成(下)

极光推送的集成(下)

作者: 柏林billy | 来源:发表于2018-08-22 16:44 被阅读0次

极光推送的集成(下)

一.下载Demo到本地

image

二. 复制Demo里libs文件夹下的所有文件到项目的libs文件夹下

1.demo的libs文件夹下的文件
2.项目libs的文件夹

注意: 导入的jar包一定要添加到库

image

说明 :使用android studio的开发者,如果使用jniLibs文件夹导入so文件,则仅需将所有cpu类型的文件夹拷进去;如果将so文件添加在module的libs文件夹下,注意在module的gradle配置中添加一下配置:

android {
    ......
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
            ......
        }
        ......
    }
    ......
}

三. AndroidManifest.xml配置

1.打开demo的xml配置文件复制所有权限到项目的配置文件

image

代码

    <!-- Required -->
<permission
    android:name="com.a.b.permission.JPUSH_MESSAGE"
    android:protectionLevel="signature" />

<!-- Required  一些系统要求的权限,如访问网络等-->
<uses-permission android:name="com.a.b.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />



<!-- Optional for location -->
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- 用于开启 debug 版本的应用在6.0 系统上 层叠窗口权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />

2.application的内容复制)
复制备注为 "Required" 的部分,根据提示把包名和Appkey填好

代码

 <!-- Required SDK 核心功能-->
    <!-- 可配置android:process参数将PushService放在其他进程中 -->
    <service
        android:name="cn.jpush.android.service.PushService"
        android:enabled="true"
        android:exported="false" >
        <intent-filter>
            <action android:name="cn.jpush.android.intent.REGISTER" />
            <action android:name="cn.jpush.android.intent.REPORT" />
            <action android:name="cn.jpush.android.intent.PushService" />
            <action android:name="cn.jpush.android.intent.PUSH_TIME" />
        </intent-filter>
    </service>


<!-- since 3.0.9 Required SDK 核心功能-->
    <provider
        android:authorities="您应用的包名.DataProvider"
        android:name="cn.jpush.android.service.DataProvider"
        android:exported="true"
    />

    <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
    <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
     <service
         android:name="cn.jpush.android.service.DaemonService"
         android:enabled="true"
         android:exported="true">
         <intent-filter >
             <action android:name="cn.jpush.android.intent.DaemonService" />
             <category android:name="您应用的包名"/>
         </intent-filter>
     </service>

     <!-- since 3.1.0 Required SDK 核心功能-->
      <provider
           android:authorities="您应用的包名.DownloadProvider"
           android:name="cn.jpush.android.service.DownloadProvider"
           android:exported="true"
       />

    <!-- Required SDK核心功能-->
    <receiver
        android:name="cn.jpush.android.service.PushReceiver"
        android:enabled="true" >
      <intent-filter android:priority="1000">
            <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
            <category android:name="您应用的包名"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.USER_PRESENT" />
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
        <!-- Optional -->
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED" />
            <action android:name="android.intent.action.PACKAGE_REMOVED" />
            <data android:scheme="package" />
        </intent-filter>
    </receiver>

    <!-- Required SDK核心功能-->
    <activity
        android:name="cn.jpush.android.ui.PushActivity"
        android:configChanges="orientation|keyboardHidden"
        android:theme="@android:style/Theme.NoTitleBar"
        android:exported="false" >
        <intent-filter>
            <action android:name="cn.jpush.android.ui.PushActivity" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="您应用的包名" />
        </intent-filter>
    </activity>
    <!-- SDK核心功能-->
    <activity
        android:name="cn.jpush.android.ui.PopWinActivity"
        android:configChanges="orientation|keyboardHidden"
        android:exported="false"
        android:theme="@style/MyDialogStyle">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="您应用的包名" />
        </intent-filter>
    </activity>

    <!-- Required SDK核心功能-->
    <service
        android:name="cn.jpush.android.service.DownloadService"
        android:enabled="true"
        android:exported="false" >
    </service>

    <!-- Required SDK核心功能-->
    <receiver android:name="cn.jpush.android.service.AlarmReceiver" />

    <!-- Required since 3.0.7 -->
    <!-- 新的tag/alias接口结果返回需要开发者配置一个自定的广播 -->
    <!-- 该广播需要继承JPush提供的JPushMessageReceiver类, 并如下新增一个 Intent-Filter -->
    <receiver
        android:name="自定义 Receiver"
        android:enabled="true" 
        android:exported="false" >
        <intent-filter>
            <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" />
            <category android:name="您应用的包名" />
        </intent-filter>
    </receiver>

    <!-- User defined. 用户自定义的广播接收器-->
     <receiver
         android:name="您自己定义的Receiver"
         android:enabled="true"
         android:exported="false">
         <intent-filter>
             <!--Required 用户注册SDK的intent-->
             <action android:name="cn.jpush.android.intent.REGISTRATION" />
             <!--Required 用户接收SDK消息的intent-->
             <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" />
             <!--Required 用户接收SDK通知栏信息的intent-->
             <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" />
             <!--Required 用户打开自定义通知栏的intent-->
             <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" />
             <!-- 接收网络变化 连接/断开 since 1.6.3 -->
             <action android:name="cn.jpush.android.intent.CONNECTION" />
             <category android:name="您应用的包名" />
         </intent-filter>
     </receiver>

    <!-- Required. For publish channel feature -->
    <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
    <!-- 例如: -->
    <!-- 发到 Google Play 的APK可以设置为 google-play; -->
    <!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
    <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
    <!-- Required. AppKey copied from Portal -->
    <meta-data android:name="JPUSH_APPKEY" android:value="您应用的Appkey"/>

把包名和和appkey都换好后发现有两个错误,根据提示的包名到demo的目录下找到,复制到项目中,再复制包名替换


image image

注意:把关联的两个复制进来后发先会报错,因为这个类调用了别类的方法,你可以根据需要复制也一起复制进来


image

四. Acitivy里的代码添加

可以参考demo的MainActivity的代码进行复制,再初始化时调用registerMessageReceiver()方法

主要是这两个方法:

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

public class MessageReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            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 (!ExampleUtil.isEmpty(extras)) {
                    showMsg.append(KEY_EXTRAS + " : " + extras + "\n");
                }
            }
        } catch (Exception e){
        }
    }
}

补充:myReceiver调用了MainActivity这个变量,并在不同的生命周期改变其值

public static boolean isForeground = false;
@Override
protected void onResume() {
    isForeground = true;
    super.onResume();
}


@Override
protected void onPause() {
    isForeground = false;
    super.onPause();
}

@Override
protected void onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
super.onDestroy();
}
最后在初始化时调用Jpush的初始化方法

 // 初始化 JPush。如果已经初始化,但没有登录成功,则执行重新登录。
    JPushInterface.init(getApplicationContext());

五. 混淆

集成 JPush Android SDK 的混淆

请下载4.x及以上版本的proguard.jar, 并替换你Android Sdk "tools\proguard\lib\proguard.jar"
请在工程的混淆文件中添加以下配置:

-dontoptimize
-dontpreverify

-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }

-dontwarn cn.jiguang.**
-keep class cn.jiguang.** { *; }

2.0.5 ~ 2.1.7 版本有引入 gson 和 protobuf ,增加排除混淆的配置。(2.1.8版本不需配置)

-dontwarn com.google.**
-keep class com.google.gson.** {*;}
-keep class com.google.protobuf.** {*;}

六.完成,发消息测试

一个简单的极光推送就完成了.觉得文章不错请点赞你的喜欢是我创作的动力

相关文章

网友评论

      本文标题:极光推送的集成(下)

      本文链接:https://www.haomeiwen.com/subject/ftuyiftx.html