您的位置:首页 > 移动开发 > Unity3D

Unity之android推送

2016-02-28 17:54 603 查看
0x00 引子

最近在整理android相关的一些工作,想起很久前做的android推送功能,记得当时网上资料不多,新手做起来有些困难,因此决定写一篇详细的博客,供大家参考一下,

0x01 交互

要想实现推送机制,那么第一步便是需要完成unity与android之间的交互,也就是c#与java之间的互相调用。

首先来看C# to java,通过查询unity官方api,发现unity提供了调用java代码的接口,下面贴出我封装好的一个类

public class AndroidNative

{

public static void ScheduleLocalNotification(string message, int seconds, int id)

{

CallActivityFunction(“ScheduleLocalNotification”,message, seconds, id);

}

public static void callLoginMethod(string methodName)
{
CallActivityFunction(methodName);
}

private static void CallActivityFunction(string methodName, params object[] args)
{
#if UNITY_ANDROID
if(Application.platform != RuntimePlatform.Android)
{
return;
}

try
{

AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

jo.Call(methodName, args);

}
catch(System.Exception ex)
{
Debug.LogWarning(ex.Message);
}
#endif
}


}

可以看到jo.Call(methodName, args);这句代码就是实现c#调用java的关键了,而调用的方法名字既是java端的ScheduleLocalNotification方法。

至于java调用c#,因为推送暂时用不到,就不说了,也很简单,需要的可以自己去查下。

0x02 android推送

android推送不比ios,ios总得来说是对开发者友好的,只需要启动一个推送,然后设置更新时间,就可以隔一段时间自动推送了,然而android不能,写一个推送,只能在你指定的时间推送一次,因此,要实现定时推送,就必须配合计时器使用了。

首先说下android定时器

需要在AndroidManifest.xml里面注册一个receiver:



还需要实现一个receiver类,”com.XXX.XXX.MyReceiver”,该类继承自BroadcastReceiver。

接着我们启动一个定时器

public void ScheduleLocalNotification (String message,int seconds, int notificationId )

{

JSONObject json = new JSONObject();
try {
json.put("message", message);
json.put("seconds",seconds);
json.put("notificationId",notificationId);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Intent intent = new Intent(this,MyReceiver.class);

intent.putExtra("json",json.toString());
// get the AlarmManager instance
AlarmManager am= (AlarmManager) getSystemService(ALARM_SERVICE);
// create a PendingIntent that will perform a broadcast
PendingIntent pi= PendingIntent.getBroadcast(UnityPlayerNativeActivity.this, 0, intent, 0);
// just use current time + 10s as the Alarm time.
Calendar c=Calendar.getInstance();

c.setTimeInMillis(System.currentTimeMillis());
c.setTimeZone(TimeZone.getTimeZone("GMT+8"));
//可以根据项目要求修改,秒、分钟、提前、延后
c.add(Calendar.SECOND, seconds);
// schedule an alarm
am.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),86400000, pi);
}


定时器就是通过广播的形式,建立一个长连接,然后在receiver类里面实现public void onReceive(Context context, Intent intent) { }方法,这样到了定时器设定的时间,就会走onRecevie方法,在该方法里面,即可实现推送逻辑,json也会通过透传的方式传递过来,String jasonStr = intent.getStringExtra(“json”);即可得到json字符串,然后起一个推送即可。

再来看推送实现,推送就很简单了,下面直接贴出代码,

public static void registerLocalNotification(final Context context, final int seconds , final String message, final int notificationId) {

Builder notification = new Notification.Builder(context);

Resources res = context.getResources();
int app_icon = res.getIdentifier("app_icon", "drawable", context.getPackageName());
int app_name = res.getIdentifier("app_name", "string", context.getPackageName());
String title = context.getString(app_name);
Intent intent = new Intent(context, UnityPlayerNativeActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, app_name, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notification.setAutoCancel(true);

notification.setContentTitle(title);
notification.setContentIntent(contentIntent);
notification.setContentText(message);
notification.setSmallIcon(app_icon);
notification.setWhen(System.currentTimeMillis());
final Notification notify = notification.build();

getNotificationManager(context).notify(notificationId,notify);

}

private static NotificationManager getNotificationManager(Context context) {
return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
}


按照要求设置好信息以后,就可以正常推送了,注意图标一定要设置正确,否则推送无法正常显示。

0x03 小结

其实android推送说起来很简单,就是启动一个定时器,定时器会通过广播的方式,按时回调onRecevie方法。代码也都贴出来了,如果还有哪里不明白,欢迎大家留言探讨。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity android api