最近打算在项目中用到推送实现相关功能模块,于是这两天看各种推送平台的文档和demo,先是用了极光试了试,遇到了问题,调了好久,可能我是新手的原因,极光感觉用起来太新潮高端,于是,只能换了Bmob,还好,bmob因为之前在它上面用过其它数据模块的原因,用起来理解起来都好很多。由于Bmob开发文档没有关于手动推送的教程,我便自己摸索起来,最后终于搞好了,接下来就可以在实际项目中集成啦。我们先从最基本的控制台推送开始,然后尝试手机客户端手动推送。
1.第一步,无疑是导Bmob包:
注意点:最好要将下载下来的bmob的sdk文件中的libs包都导入,防止出现相关错误
2.在应用程序AndroidManifest.xml文件中添加相应的权限:
比较简单,这里直接贴代码了:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.bmobpushtest" > <!--BmobSDK所需的权限 --> <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.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--推送所需的权限--> <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:label="PushService" android:name="cn.bmob.push.lib.service.PushService" android:process=":bmobpush" android:exported="true"> <intent-filter> <action android:name="cn.bmob.push.lib.service.PushService"/> </intent-filter> </service> <!-- 用于进程保活 --> <service android:name="cn.bmob.push.lib.service.PushNotifyService" android:process=":bmobpush" > </service> <receiver android:name="cn.bmob.push.PushReceiver" > <intent-filter> <!-- 系统启动完成后会调用 --> <action android:name="android.intent.action.BOOT_COMPLETED" /> <!-- 解锁完成后会调用 --> <action android:name="android.intent.action.USER_PRESENT" /> <!-- 监听网络连通性 --> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> <!-- 接收心跳和唤醒的广播,要和PushService运行在同个进程 --> <receiver android:name="cn.bmob.push.PushNotifyReceiver" android:process=":bmobpush" > <intent-filter> <!-- 接收心跳广播的action --> <action android:name="cn.bmob.push.action.HEARTBEAT" /> <!-- 接收唤醒广播的action --> <action android:name="cn.bmob.push.action.NOTIFY" /> </intent-filter> </receiver> <!-- 第四部中创建的消息接收器,在这里进行注册 --> <receiver android:name="test.bmobpushtest.MyPush"> <intent-filter > <action android:name="cn.bmob.push.action.MESSAGE"/> </intent-filter> </receiver> </application>
</manifest>
注意:如果你要接收到推送信息,并将其以Notification的形式展示的话,需要创建一个自己的BroadcastReceiver,先在Manifest中注册一下,即上面的第四步
3.接下来就创建一个自己的BroadcastReceiver类MyPush代码如下:
/** * Created by MuFeng on 2017/3/28. */ public class MyPush extends BroadcastReceiver{ @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub if(intent.getAction().equals(PushConstants.ACTION_MESSAGE)){ //收到消息进行一些处理:发送一个通知 String jsonStr = intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING); String content = null; //处理Json的数据,将其转化为正常string类型 try { JSONObject jsonObject=new JSONObject(jsonStr); content=jsonObject.getString("alert"); } catch (JSONException e) { e.printStackTrace(); } NotificationManager manager= (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE); Notification notification= new Notification.Builder(context). setSmallIcon(R.mipmap.ic_launcher).//设置推送消息的图标 setContentTitle("您收到一条推送信息!") .//设置推送标题 setContentText(content).build();//设置推送内容 manager.notify(1,notification);//设置通知栏 Log.d("bmob", "客户端收到推送内容:"+intent.getStringExtra("msg")); } } }这里需要注意的是:通过intent.getStringExtra()接收前面推送内容,得到的是Json的格式,我们需要将json格式String数据转化为我们熟悉的String类型,然后自己在写个Notification通知栏来显示推送的数据。
4.接下来就剩下MainActivity这个活动了:
public class MainActivity extends AppCompatActivity { BmobPushManager manager=new BmobPushManager(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化BmobSDK Bmob.initialize(this, "12f8d65c69d28954b6c875aafbc0aaaa"); setContentView(R.layout.activity_main); // 使用推送服务时的初始化操作 BmobInstallation.getCurrentInstallation().save(); // 启动推送服务 BmobPush.startWork(this); }将app id替换成自己控制端的app id即可,bmob上面有教程,这里就不多说了,我们先在控制端的推送模块输入:“这是第一条推送消息,哈哈!”来点击推送运行一下看看简单效果吧:
看吧,控制端推送的基本功能实现了,接下来看看怎么样在客户端手动推送吧。
5.我们在布局里放一个按钮,布局文件如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" tools:context="test.bmobpushtest.MainActivity"> <Button android:id="@+id/open_myself" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:layout_margin="16dp" android:text="手动开启推送" /> </LinearLayout>就只有一个按钮,来通过点击实现手动推送。
6.增加MainActivity里面手动推送的功能代码:
我们写一个自己的方法pushMessage()来实现手动推送,如何实现呢?Bmob已经为我们提供了回调接口PushListener,让我们看看如何实现吧:
private void pushMessage(String message){ manager.pushMessageAll(message, new PushListener() { @Override public void done(BmobException e) { if(e==null){ Log.d("BmobPush","推送成功!"); }else{ //loge(e); } } }); }通过调用BmobPushManager对象的pushMessageAll()方法实现手动推送,第一个参数是要推送的内容,第二个放入回调监听器PushListener
接下来让我们在按钮的点击事件中添加该功能代码看看效果吧:
button= (Button) findViewById(R.id.open_myself); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //手动开启推送请求 // 推送一条消息给所有安装此应用的设备 pushMessage("手动推送消息给所有用户!"); } });我们推送内容为:“手动推送消息给所有用户!”运行一下:
没问题,让我们点击一下按钮看看效果:
看,真的实现了,接下来我们就可以将其封装到自己的项目中,自己可以慢慢摸索用法,实现更多功能。
补充:本文仅作记录和供大家参考,不足和需要改进之处请大家提出来,谢谢。