在Mono for Android中集成JPush数据推送功能
xaccc (xac@163.com)
【代码下载】
最近学习使用Mono for Android进行程序开发,为在程序中增加数据推送的功能,选用了JPush(极光推送)来实现,经过上网查找,借助于官方文档,最终实现了JPush的集成。本文以JPush SDK1.6.1、Mono for Android 4.10.x为例,说明如何将JPush库集成到Mono for Android程序中(以下简称M4A)。
1、创建Java绑定库。
本人觉得Java绑定库是M4A中一个非常好的功能,可以让C#来方便的使用各种Java库。相比而言,Delphi XE5、XE6中缺乏类似的功能,Delphier很是苦恼于如何方便的调用Java的库。如对此不了解,请先参考xamarin文档,学习xamarin工程集成java库的基础原理。
1.1 创建JPush的Android Java Binding Library项目
启动Visual Studio,新建一个Java Bindings Library工程,如图1所示。
图1新建Android Java Binding Library
1.2 将JPush的Jar与so文件添加工程中
将jpush的 .jar文件复制到工程的将Jars文件中。然后,在工程中创建libs文件夹,然后在libs文件中创建armeabi文件夹和armeabi-v7a文件夹。
然后将JPush的 .so文件复制到libs中的armeabi和armeabi-v7a文件中。如图2所示。
图2 添加jar和so文件到项目中
1.3 修改jar和so文件的属性
为了能正确生成Java Bindings Library,需要设制jar与so的属性,如图3所示。
图3设置添加的库文件的生成操作方式
1.4 生成DLL
经过上述的设置后,编译后便可生成C#可以调用的DLL库。将该项目添加到M4A项目的引用中,就可以在手机项目的代码中使用C#封装好的原JPush的Java库的功能了。
2. 创建示例工程,引用Java绑定库并配置JPush参数
2.1 新建一个Mono的项目
在刚才的解决方案中,新添加一个项目(Android Application),如图4所示。然后添加Java Bindings Library的引用,如图5所示。
图4新建Application项目
图5添加绑定库的引用
2.2 配置AndroidManifest.xml文件
(1) 在JPushAndroidApplication的项目属性设置中,按图6所示设置参数,关键是包名的设置。
图6设置项目属性
(2) 添加权限、App key等配置信息
打开“AndroidManifest.xml”文件,按官方文档编辑内容,如下所示。
<?xmlversion="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"android:installLocation="auto"package="com.embarcadero.MobileBoss"android:versionCode="1"android:versionName="1.0.0.">
<uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="8" />
<permissionandroid:name="com.embarcadero.MobileBoss.permission.JPUSH_MESSAGE"android:protectionLevel="signature" />
<uses-permissionandroid:name="com.embarcadero.MobileBoss.permission.JPUSH_MESSAGE" />
<uses-permissionandroid:name="android.permission.RECEIVE_USER_PRESENT" />
<uses-permissionandroid:name="android.permission.INTERNET" />
<uses-permissionandroid:name="android.permission.WAKE_LOCK" />
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permissionandroid:name="android.permission.VIBRATE" />
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permissionandroid:name="android.permission.WRITE_SETTINGS" />
<!--since 1.6.0-->
<!-- Optional. Requiredfor location feature-->
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_UPDATES" />
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permissionandroid:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE" />
<applicationandroid:label="JPushDemoApp"android:icon="@drawable/Icon">
<!-- Required-->
<serviceandroid:name="cn.jpush.android.service.PushService"android:enabled="true"android:exported="false">
<intent-filter>
<actionandroid:name="cn.jpush.android.intent.REGISTER" />
<actionandroid:name="cn.jpush.android.intent.REPORT" />
<actionandroid:name="cn.jpush.android.intent.PushService" />
<actionandroid:name="cn.jpush.android.intent.PUSH_TIME" />
</intent-filter>
</service>
<!-- Required-->
<receiverandroid:name="cn.jpush.android.service.PushReceiver"android:enabled="true">
<intent-filterandroid:priority="1000">
<!--since 1.3.5-->
<actionandroid:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" />
<!--since 1.3.5-->
<categoryandroid:name="com.embarcadero.MobileBoss" />
<!--since 1.3.5-->
</intent-filter>
<!--since 1.3.5-->
<intent-filter>
<actionandroid:name="android.intent.action.USER_PRESENT" />
<actionandroid:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
<intent-filter>
<actionandroid:name="android.intent.action.PACKAGE_ADDED" />
<actionandroid:name="android.intent.action.PACKAGE_REMOVED" />
<dataandroid:scheme="package" />
</intent-filter>
</receiver>
<!-- Required SDK核心功能-->
<activityandroid:name="cn.jpush.android.ui.PushActivity"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="orientation|keyboardHidden">
<intent-filter>
<actionandroid:name="cn.jpush.android.ui.PushActivity" />
<categoryandroid:name="android.intent.category.DEFAULT" />
<categoryandroid:name="com.embarcadero.MobileBoss" />
</intent-filter>
</activity>
<!-- Required SDK核心功能-->
<serviceandroid:name="cn.jpush.android.service.DownloadService"android:enabled="true"android:exported="false"></service>
<!-- Required SDK核心功能-->
<receiverandroid:name="cn.jpush.android.service.AlarmReceiver" />
<meta-dataandroid:name="JPUSH_CHANNEL"android:value="developer-default" />
<meta-dataandroid:name="JPUSH_APPKEY"android:value="你的APP_Key"/>
</application>
</manifest>
2.3 初始化与JPush平台连接
打开项目的主界面的Acivity1.cs文件,添加初始化代码,如图7所示。
图7初始化jpush的代码
2.4 启动调试
一切准备就绪(记得让手机连接网络),开始运行,如能看到如图8所示信息,恭喜你,成功了。在jpush protal中发送条通知试试吧!
图8 JPush的输出调试信息
【以下不是必须】
3. 构造自己的Receiver
3.1 在项目中添加一个新类,继承自CN.Jpush.Android.Service.PushReceiver。
3.2 修改代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using CN.Jpush.Android.Service;
namespace JPushMonoDemo
{
[BroadcastReceiver]
[IntentFilter(newstring[] { "cn.jpush.android.intent.REGISTRATION"}, Categories =new string[]{ "com.embarcadero.MobileBoss" })]
[IntentFilter(newstring[] { "cn.jpush.android.intent.UNREGISTRATION"}, Categories =new string[]{ "com.embarcadero.MobileBoss" })]
[IntentFilter(newstring[] { "cn.jpush.android.intent.MESSAGE_RECEIVED"}, Categories =new string[]{ "com.embarcadero.MobileBoss" })]
[IntentFilter(newstring[] { "cn.jpush.android.intent.NOTIFICATION_RECEIVED"}, Categories =new string[]{ "com.embarcadero.MobileBoss" })]
[IntentFilter(newstring[] { "cn.jpush.android.intent.NOTIFICATION_OPENED"}, Categories =new string[]{ "com.embarcadero.MobileBoss" })]
[IntentFilter(newstring[] { "cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK"}, Categories =new string[]{ "com.embarcadero.MobileBoss" })]
public class MyJPushReceiver: PushReceiver
{
public override voidOnReceive(Context ctx,Intent ite)
{
//在这里处理各种消息类型
Toast.MakeText(ctx,"Received intent!",ToastLength.Short).Show();
//base.OnReceive (ctx, ite);
}
}
}
因为在类声明前面进行了修饰,可以省去在AndroidManifest.xml中进行配置。
参考文献:
[1] http://smilehyh.blog.163.com/blog/static/123343886201362110857402/