首先我们要申请一个极光推送的账号,用自己项目的包名在控制台里创建一个自己的应用
创建好的应用界面如图下所示,在后面的配置中我们会用到这个appKey和secret
现在我们就可以在自己的项目里面集成了
我们去下载极光的sdk包,把sdk拷到我们相应的项目文件夹下,如下图所示:
现在我们开始配置我们的清单文件:
必需的权限 少不了:
<permission android:name="您的包名.permission.JPUSH_MESSAGE" android:protectionLevel="signature" /> <!-- 要求 --> <uses-permission android:name="您的包名.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.WAKE_LOCK" /> <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.VIBRATE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACTION_APPLICATION_DETAILS_SETTINGS"/> <!-- Optional. Required for location feature --> <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" />
下面是极光推送的核心服务的配置:
<!-- 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="com.jspush.jpushdemo.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="com.jspush.jpushdemo"/> </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/AppTheme"> <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=".MyJPushMessageReceiver" android:enabled="true" > <intent-filter> <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" /> <category android:name="您的包名" /> </intent-filter> </receiver> <!-- User defined. 用户自定义的广播接收器--> <receiver android:name=".MyReceiver" android:enabled="true"> <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"/> <!-- 设置 AppKey --> <meta-data android:name="JPUSH_APPKEY" android:value="您的APP_KEY"/>
好了现在我们的清单文件就配置完了,下面看一下主要的服务类的代码
一定要在APPlication里面初始化极光
下面的是广播的一个接收器
/** * 自定义广播接收器 */ public class MyReceiver extends BroadcastReceiver { private static final String TAG = "MyReceiver"; @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) { String regId = bundle.getString(JPushInterface.EXTRA_REGISTRATION_ID); Log.e(TAG, "JPush用户注册成功id: " + regId); } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) { Log.e(TAG, "接受到推送下来的自定义消息id: " + bundle.getString(JPushInterface.EXTRA_MESSAGE)); } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) { int notifactionId = bundle.getInt(JPushInterface.EXTRA_NOTIFICATION_ID); Log.e(TAG, "接受到推送下来的通知id: " + notifactionId); } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { // Intent i = new Intent(context, TestActivity.class); // i.putExtras(bundle); // i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // context.startActivity(i); Log.e(TAG, "用户点击打开了通知跳转的Activity: "); } else if (JPushInterface.ACTION_RICHPUSH_CALLBACK.equals(intent.getAction())) { Log.e(TAG, "onReceive: " + bundle.getString(JPushInterface.EXTRA_EXTRA)); } else if (JPushInterface.ACTION_CONNECTION_CHANGE.equals(intent.getAction())) { boolean connected = intent.getBooleanExtra(JPushInterface.EXTRA_CONNECTION_CHANGE, false); Log.e(TAG, "onReceive: " + intent.getAction() + " 连接状态变化 " + connected); } else { Log.e(TAG, "onReceive: 未处理的意图- " + intent.getAction()); } } }
下面的是标签、别名、ID个推和群推的一个服务的接收器
public class MyJPushMessageReceiver extends JPushMessageReceiver { private static final String TAG = "MyJPushMessageReceiver"; /** * tag增删查改的操作会在此方法中回调结果 */ @Override public void onTagOperatorResult(Context context, JPushMessage jPushMessage) { super.onTagOperatorResult(context, jPushMessage); //下面2个回调类似 Log.e("------TAG", "onTagOperatorResult查询得到的别名: " + jPushMessage.getAlias()); Log.e("------TAG", "onTagOperatorResult查询得到的标签: " + jPushMessage.getTags()); Log.e("------TAG", "onTagOperatorResult错误码0为成功: " + jPushMessage.getErrorCode()); Log.e("------TAG", "onTagOperatorResult传入的标示: " + jPushMessage.getSequence()); } /** * 查询某个tag与当前用户的绑定状态的操作会在此方法中回调结果 */ @Override public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) { super.onCheckTagOperatorResult(context, jPushMessage); Log.e("------TAG", "onCheckTagOperatorResult错误码0为成功: " + jPushMessage.getErrorCode()); } /** * alias相关的操作会在此方法中回调结果 */ @Override public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { super.onAliasOperatorResult(context, jPushMessage); Log.e("------TAG", "onAliasOperatorResult错误码0为成功: " + jPushMessage.getErrorCode()); } }
最后写一个判断通知栏是否已经开启的通知栏的一个工具类,就OK了
下面我们在MainActivity里面用一下:
首先判断下通知栏是否开启,只有在开启的情况下才能用标签、别名、ID推送
我的demo里面是标签推送,下面我添加了几个标签
ok,完了,功能也实现了
本demo已经测试完毕,已经运用到自己的项目中,可以放心使用!
本博客只是记录开发的点滴,不喜勿喷!
下面是demo下载地址,有意愿的朋友可以下载:https://download.csdn.net/download/android123it/10546271
谢谢!!!!