场景
经常会有后台服务向Android推送消息通知的情况。
如果在推送需求量不大的情况下可以使用较成熟的极光推送。
极光推送官网:
极光提供有限制的推送服务
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
在极光官网中找到开发者服务,进入开发者平台
然后点击创建应用
新建应用时要设置一个包名,记住这个包名在代码中要用到
然后选择推送服务
点击下一步,然后可以选择要集成的厂商通道
选择集成Android
然后官方提供了集成的文档以及sdk的下载和demo,我们在Android中集成时可以通过jcenter的方式去集成依赖,新建应用完成后
复制出来应用包名和AppKey,然后在Android Studio中新建一个Android应用
在Project根目录的build.gradle中配置了jcenter,默认会配置支持
然后在module下app的build.gradle中添加相关依赖
implementation 'cn.jiguang.sdk:jpush:3.3.4' // 此处以JPush 3.3.4 版本为例。 implementation 'cn.jiguang.sdk:jcore:2.1.0' // 此处以JCore 2.1.0 版本为例。
添加位置如下
然后还是在这里面manifest替换变量
defaultConfig { applicationId "com.badao.pushdemo" minSdkVersion 16 targetSdkVersion 30 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk { //选择要添加的对应cpu类型的.so库。 abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64', 'mips', 'mips64' } manifestPlaceholders = [ JPUSH_PKGNAME : applicationId, JPUSH_APPKEY : "Push上注册的包名对应的appkey", //JPush上注册的包名对应的appkey. JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可. ] }
替换位置
注意这里的两个地方:
applicationId是你在极光开发平台上新建应用时的包名要一致,
然后下面的JPUSH_APPKEY是新建应用的对应的appkey
然后打开项目的AndroidManifest.xml中添加权限
<!-- Required --> <permission android:name="com.badao.pushdemo.permission.JPUSH_MESSAGE" android:protectionLevel="signature" /> <!-- Required --> <uses-permission android:name="com.badao.pushdemo.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.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- Optional. Required for location feature --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <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" /> <uses-permission android:name="android.permission.VIBRATE" />
注意这里的第一个权限前面的包名要一致
然后在AndroidManifest.xml中再注册一个继承JCommonService的服务
<!-- 注册继承JCommonService的服务 --> <service android:name=".PushService" android:enabled="true" android:exported="false" android:process=":pushcore"> <intent-filter> <action android:name="cn.jiguang.user.service.action" /> </intent-filter> </service>
然后在包路径下新建PushService
代码如下
package com.badao.pushdemo; import cn.jpush.android.service.JCommonService; public class PushService extends JCommonService { }
然后再在AndroidManifest.xml中自定义一个receiver替换原生极光推送接收器
<!-- 替换原生极光推送接收器 --> <receiver android:name=".MyReceiver" android:enabled="true" android:exported="false"> <intent-filter> <action android:name="cn.jpush.android.intent.RECEIVE_MESSAGE" /> <category android:name="com.badao.pushdemo" /> <!--JPush上注册的包名 --> </intent-filter> </receiver>
注意这里的包名和JPush上注册的一致
然后再在包路径下新建MyReceiver
修改代码如下
package com.badao.pushdemo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import cn.jpush.android.api.CustomMessage; import cn.jpush.android.api.JPushMessage; import cn.jpush.android.api.NotificationMessage; import cn.jpush.android.service.JPushMessageReceiver; public class MyReceiver extends JPushMessageReceiver { private static final String TAG = "JIGUANG"; private Intent intent; @Override public void onConnected(Context context, boolean b) { super.onConnected(context, b); Log.e(TAG, "onConnected"); } @Override public void onRegister(Context context, String s) { super.onRegister(context, s); Log.e(TAG, "onRegister" + s); } @Override public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) { Log.i("bieming","bieming:"+jPushMessage.getAlias()); super.onAliasOperatorResult(context, jPushMessage); Log.e(TAG, jPushMessage.toString()); } /** * 可以利用附加字段(notificationMessage.notificationExtras)来区别Notication,指定不同的动作,附加字段是个json字符串 * 通知(Notification),指在手机的通知栏(状态栏)上会显示的一条通知信息 */ @Override public void onNotifyMessageArrived(Context context, NotificationMessage notificationMessage) { super.onNotifyMessageArrived(context, notificationMessage); Log.e(TAG, notificationMessage.toString()); } /** * notificationMessage.notificationExtras(附加字段)的内容处理代码 * 比如打开新的Activity, 打开一个网页等.. */ @Override public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) { super.onNotifyMessageOpened(context, notificationMessage); Log.e(TAG, notificationMessage.notificationExtras); Intent intent = new Intent(context, MainActivity.class); context.startActivity(intent); } /** * 自定义消息不是通知,默认不会被SDK展示到通知栏上,极光推送仅负责透传给SDK。其内容和展示形式完全由开发者自己定义。 * 自定义消息主要用于应用的内部业务逻辑和特殊展示需求 */ @Override public void onMessage(Context context, CustomMessage customMessage) { super.onMessage(context, customMessage); Log.e(TAG, "onMessage"); } }
在自定义接收器中重写一些方法来实现相关的回调
然后在MainActivity中进行对Jpush的初始化
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化极光推送 JPushInterface.setDebugMode(true); JPushInterface.init(this); if (!isNotificationEnabled(this)) { gotoSet();//去设置开启通知 } else { //当前app允许消息通知 } }
然后后面进行是否设置开启通知的判断,其中
//是否允许通知 private boolean isNotificationEnabled (Context context){ boolean isOpened = false; try { isOpened = NotificationManagerCompat.from(context).areNotificationsEnabled(); } catch (Exception e) { e.printStackTrace(); isOpened = false; } return isOpened; }
然后
//去设置允许通知 private void gotoSet () { Intent intent = new Intent(); if (Build.VERSION.SDK_INT >= 26) { // android 8.0引导 intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("android.provider.extra.APP_PACKAGE", getPackageName()); } else if (Build.VERSION.SDK_INT >= 21) { // android 5.0-7.0 intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); intent.putExtra("app_package", getPackageName()); intent.putExtra("app_uid", getApplicationInfo().uid); } else { // 其他 intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS"); intent.setData(Uri.fromParts("package", getPackageName(), null)); } intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
然后将项目运行,登录极光开发者平台找到推送消息
目标人群选择所有人
则会在App中收到推送
通过别名设置指定设备进行推送
上面是对所有的设备进行推送,如果需要对指定的设备进行推送的话
可以通过设置设备的别名来实现。
注意跟标签的区别,标签是一类设备,别名是指定设备
首先在主页面上添加两个按钮
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="注册别名" tools:layout_editor_absoluteX="210dp" tools:layout_editor_absoluteY="462dp" /> <Button android:id="@+id/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="解除注册别名" tools:layout_editor_absoluteX="210dp" tools:layout_editor_absoluteY="462dp" android:layout_below="@id/button1"/> </RelativeLayout>
然后在MainActivity中的onCreate中设置点击事件分别为设置别名和删除别名。
//设置别名-一般在登录时 findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { JPushInterface.setAlias(getApplicationContext(),0000000001,"badaodechengxvyuan"); Log.i("setAlias","setAlias"); } }); //删除别名一般在注销登录时 findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { JPushInterface.deleteAlias(getApplicationContext(),0000000001); Log.i("deleteAlias","deleteAlias"); } });
其中设置别名一般在App进行登录时设置
然后删除别名一般在注销登录后进行,这里设置别名和删除别名都使用按钮事件去实现
然后启动项目,点击注册别名按钮。
另外在自定义接收器中的onAliasOperatorResult可以实现对别名注册与删除别名的回调
然后登录极光开发者后台,在消息推送中目标选择中设置设备别名
然后就会在指定的app设备中收到推送
然后在日志中也能看到进入到别名设置的回调中了
然后再点击一下删除别名注册按钮,则在设备上就收不到推送消息了,并且在极光开发者后台也会提示
然后在回调方法中也输出
示例代码下载
https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/15435342