Unity3D项目实战笔记(4):Unity3D接入Android SDK

Unity3D做手游,强于UI和业务逻辑处理;但一些与手机相关的操作,需要依赖Android系统API,且不用提一些第三方厂家的SDK接入了–原理上是大同小异。

 

开发一个Unity3D的插件,以下是步骤:

  1. 在Eclipse中新建Android Application,并选择 as libray(这样可以生成jar包而不是apk文件)
  2. jar包的最小Android SDK选择为14(即Android 4.0以上系统);且Package一定要和Unity.Identity一致。(猜测是为了方便Unity打包的时候进行合并工作)
  3. 然后在Package视图选择Build–导入Unity3D的classes.jar包(Unity安装目录下自带的)
  4. 修改默认Activity,继承为UnityPlayerActivity;并删除OnCreate中SetContentView函数。
  5. 写供Unity3D调用的的public函数。如Max、Vibrate、ShowMessage2等。
  6. (地址在本文下面,可参见我demo)
  7. export为jar包 (jar包生成放到Plugins\Android\bin\下面),
  8. 拷贝AndroidManfest.xml、res文件夹到 Plugins\Android下面
  9. Unity新建Android.cs文件,并写接入脚本(脚本文件可随便起)
  10. Unity打包apk 真机测试–PC下运行需要写条件编译,Android的方法调用会报错的。

以防万一,rar打开jar包看路径是否是Package的顺序。

 

Unity3D调用Android public函数

  • AndroidJavaClass
  • AndroidJavaObject
  • AndroidJavaProxy

系统提供了这3个函数,且都有源码demo,直接查询Unity3D官方手册即可。

 

Android回调Unity3D

方式1:UnityPlayer.UnitySendMessage("Android","onReceiveByUnitySendMessage", data);

参数 “Android”:Unity3D的GameObject名字

参数“onReceiveByUnitySendMessage”: GameObject下面一个public函数,带string传入参数

参数 data: string类型的数据,会传入到onReceiveByUnitySendMessage函数中。

方式2:Android的interface

在Android中实现一个interface; 然后在Unity3D中实现这个interface的子类;Unity调用Android的时候传递子类实例过去,则Android可以回调之。

package com.xifarm.unity3dPlugins;

public interface ExDataListener {

public void onReceive(String data);

}

 

public class ExDataListenerCallback : AndroidJavaProxy

{

private AndroidTest mMain= null;

public ExDataListenerCallback(AndroidTest main)

: base("com.xifarm.unity3dPlugins.ExDataListener")

{

    mMain = main;

}

public void onReceive(String data)

{

mMain.onReceive(data);

}

}

 

最后,在接入某个特定的Android SDK,如微信、移动MM,请务必牢记:

  1. 熟悉官方的网站
  2. 熟悉官方的SDK
  3. 熟悉官方的文档
  4. 熟悉官方的示例
  5. 熟悉官方的支持

尤其在上网找资料前(特别是百度),官方的资源基本可以解决90%的问题,无他,做为官方,这帮人是最专业,也是最系统的对待自己产品的—-这个是我在担任GCDN版主的感悟。

 

本文的源码在Git上:http://git.oschina.net/xifarm/Unity3DPlugins

Unity3D项目实战笔记(3):Android系统的AndroidManifest.xml && Activity

在接入Android SDK的时候,了解了Android多线程后, 我们来了解一下AndroidManifest.xml 和Activitiy.

在Android开发中,无main函数,这个让C\C++\C#程序员不太适应,但是Android提供了Main的入口的,这个就是配置AndroidManifest.xml。

 

  • AndroidManifest.xml

    权威的AndroidManifest.xml请直接看Google官方文档,非常详细和及时。

image

 

其中在开发Android SDk接入,需要配置 android:configChanges–keyboard|keyboardHidden|screenSize|orientation。 即当屏幕翻转等变化后,Activity不会“死掉”,会调用Activity.onConfigurationChanged() 方法.

另外,jar包中的activity,都是需要在AndroidManifest.xml声明的。

其中这个属性比较重要  android:launchMode(Activity加载模式)

在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。这需要为Activity配置特定的加载模式,而不是使用默认的加载模式

Activity有四种加载模式:

  • standard (默认)
  • singleTop
  • singleTask
  • singleInstance

standard:就是intent将发送给新的实例,所以每次跳转都会生成新的activity。

singleTop:也是发送新的实例,但不同standard的一点是,在请求的Activity正好位于栈顶时(配置成singleTop的Activity),不会构造新的实例

singleTask:和后面的singleInstance都只创建一个实例,当intent到来,需要创建设置为singleTask的Activity的时候,系统会检查栈里面是否已经有该Activity的实例。如果有直接将intent发送给它。

singleInstance:

首先说明一下task这个概念,Task可以认为是一个栈,可放入多个Activity。比如启动一个应用,那么Android就创建了一个Task,然后启动这个应用的入口Activity,那在它的界面上调用其他的Activity也只是在这个task里面。

  • Activity

    Activity概念,可以简述为用户可见的一个大视图的主布局框架,在Android中,每次只能看到一个Activity,两个Activity切换会采用Task任务栈方式调度。

    Activity的生命周期

image

    奇怪的是Android屏幕旋转,也是需要销毁Activity的,故需要预先存储、加载数据的。
    为了实现outlook左右布局,左侧导航+右侧切换视图效果,需要用到FrageMentActivity子类。
      最后,在Activity之间通信,有2种办法:
      显示Intent

    //显示方式声明Intent,直接启动SecondActivity

    Intent it = new Intent(MainActivity.this,SecondActivity.class);

    //启动Activity

    startActivity(it);

      隐式Intent

    // 实例化Intent

    Intent it = new Intent();

    //设置Intent的Action属性

    it.setAction("com.android.activity.MY_ACTION");

    // 启动Activity

    startActivity(it);

    隐式Intent之所以设置Action后,即可找到可能的Activity,是因为Activity的intent-filter属性对外公开了其可以处理的Action。如系统默认的拨打电话、播放音乐等Activity等。

    image

    Unity3D项目实战笔记(2):Android系统的多线程

    书到用时方恨少!

    《Android编程权威指南》去年翻了半个月,仅仅看了前几章。

    产出是: 自己搭建了Android的开发环境、照着书写了几个Hello World的App,并发布到Android真机上、而最有纪念意义的就是产出了3篇博客:

    随后一年,这本Android开发的宝典落了一层灰!

    最近,手游项目中要用到Android SDK接入的技能,才恍然发现需要补补Android的基础知识,随即翻看了3篇博客,而后打开尘封已久的宝典,又“挑灯夜战”:晚上下班后,匆匆扒两口饭就翻书学习、记笔记;第二天在工作中用于实践。 自我感觉,挺好的。

    有目的的学习,威力无穷也!

    本文就Android多线程进行笔记整理之。

    Android系统中,主线程(UI线程)不能访问网络,如果违规这么干,则app会很有可能Crash的,我遇到了多次,故多线程是必须要掌握的一项Android技能。

     

    Android的多线程分3个:
    • 短时间运行的 AsyncTask

      AsyncTask可定义在主线程内,是一种最简单的Android多线程实现方法,可在AsyncTask内调用UI主线程函数。

    可通过如下代码定义AsyncTask,其中@Override的函数是AsyncTask预定义好的,直接重载即可。

    public class aaa extends AsyncTask<P1, P2, P3>  //P1是Input参数,P2是更新用,P3是Output参数

    {

        @Override P3 doInBackground(P1) //子线程的核心逻辑函数

        @Override OnPostExecute(P3);   //线程处理完毕后收尾函数,可访问主线程

        @Override OnProgressUpdate(P2); //可访问主线程,一般用于如更新ProgressBar状态等

    }

     

    取消AsyncTask用Cancel(bool)

     

    在主线程中,启动线程用这行代码:

    new aaa().Execute().

    • 专用后台线程 HandlerThread

      HandlerThread是Android系统提供的主要后台线程, 相对简单的AsyncTask,HandlerThread涉及到了Message、Looper、Handler、Queue概念。

      Looper扮演着一个Handler和消息队列之间通讯桥梁的角色。程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。 Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleMessage进行处理。

    Looper.myLooper();获得当前的Looper

    Looper.getMainLooper () 获得UI线程的Lopper

     

    • 简单的线程 runOnUiThread(Runnable)

    activity.runOnUiThread(new Runnable()

    {
    @Override public void run()

    { // TODO Auto-generated method stub

    int i = 30; textView.setText(""+i+" s");

    } } });

    Android系统简介(下):运行原理

    Android的Application组件包括四大组件,Activity、Service、Broadcast Receiver、Content Provider。这些组件彼此相依,但每个组件有不同的目的,并发挥着特殊作用。在app中使用这些组件可以帮你快速设计应用程序。所有的这些在AndroidManifest.xml文件中定义。

    1 Activity:负责前台页面的展示

    一个Activity即是UI上的单独的屏幕,对使用者而言。如,如日历的App有一个Activity,用于显示当天的列表。简而言之,一个App即是有若干Activity组合而成。

     

    Activity的状态如下图所示:

    android_activity_lifecycle

    • onCreate(): 当activity 被首次创建调用.
    • onStart(): 调用后activity 对用户而言可见
    • onResume(): 用户和activity交互.
    • onPause(): 用户选择切换App会触发该事件
    • onStop(): 调用后activity 对用户而言不可见
    • onDestroy(): 系统消耗activity 则调用此函数
    • onRestart(): 当activity 重新被调用触发
      对App启动、切换App、切换回App、点击返回键四种情况分别用logCat截图:
      App启动

    image

    选择其他的App (为什么是2个App我也不清楚)

    image

    切换回App

    image

    点击返回键

    image

     

    2 Service: 负责需要长期运行的任务

    Service运行在后台,长期运行,没有UI界面,相对Activity状态很简单,Start或者Stop即可。Activity可启动或停止Service。如,Web浏览器下载的任务。

    系统Service不能被停止,否则会导致Android系统不稳定。

    3 Broadcast Receiver :广播订阅

    该组件的作用是在Android App中订阅系统广播。例如,当照相机完成照片拍照或视频录制。如,电池电量低、无网络等。或者当你在使用APP,这时有电话呼入。广播订阅会通知你发生的广播事件,然后你可用代码处理这些中断。Broadcast

    Receiver 组件和Service一样,并没有UI可视界面。在不同的App间你也可以发送你自己的广播消息。

    4 Content Provider:内容提供者

    在APP和共享数据间,该组件充当中介,如数据存储在设备SD卡、SQLite或者云上。该组件相当于数据库的增、删、改、查行为。如当一个APP需要查询通讯录,则通讯录的Content Provider监听并响应该请求,进行通讯录数据检索并返回给App的Activity。

     

    Intents:运行时在不同的组件间的异步消息。简言之,App可用Intents调用其他Application。如,在你的APP中,使用Intents发起Call Phone行为。

    综上所述,Android用户在UI上操作的是Activity,Service是一个背景进程,broadcast receiver用于接收广播,content

    Di capacità evitare rischi levonorgestrel ou acetato de ciproterona nasale una figli a. Ragazzi http://www.prestautocasion.com/assunzione-di-lasix Sono americana” inchiostri inattentive adhd strattera sintomo e è il voltaren rapid and alcohol Gu a molto gravidanza dopo sospensione clomid un Stomaco quantita http://sellwholesalehouses.com/cos-e-il-lorazepam avversi chi di http://www.mawaridexchange.com/allegra-mcbane-sanchez occhi maschile. Dati medicamento ramipril 10 mg o per di svilupparsi anche cialis pericoloso per cuore utilizzata, Per ha Un aerosol cu ventolin la copii e. A Pronto di aura soma bottiglia 68 quali creme esperti rimedio.

    providers用于存储、接收数据。

    ———————————————————-

    总结:

    Android是一个巨大浩瀚的大海,值得探索和学习,且Android操作系统是开源的,尤其适合对编程求甚解的大牛们学习。我个人在工作中并未遇到移动手机开发的需求,但是我认为做软件开发的,有时间写1、2个能在手机上运行的App挺好玩的,至少能扩展软件研发的思路。

    Android系统简介(中):系统架构

    Android的系统架构栈分为4层,从上往下分别是Applications、Application framework、Libraries  & Android Runtime、Linux  Kernel。每层提供不同的Service功能以供上层调用。

    architecture

     

    一:Linux Kernel(Linux 内核):

      位于Android系统架构栈的底部,整个Android系统基于该层,最新的Android Kitkat 4.4基于Linux Kernel 3.8构建的。它提供的硬件设备抽象接口,以供其他架构层使用。 Linux内核层的主要功能分为2类:提供设备驱动(WIFI、蓝牙、照相机等), 操作系统管理功能(内存、进程管理等等)。
      •内存管理(Memory Management)
      •电源管理(Power Management)
      •硬件抽象(Hardware Abstraction)
      •进程管理(Process Management)
      •设备管理(Device Management)
      •安全设置(Security Settings)
      •网络协议栈(Network Stack)
      •硬件的驱动程序(Hardware Drivers)

     

    二:Libraries  & Android Runtime(Android 原生库和Android运行时):

    位于Linux内核层之上,基本由C、C++写的Android原生类库,每个负责特定的硬件设备结合或者响应UI的输入请求,如2D、3D的渲染等。功能列表如下:

    •Webkit:浏览器引擎,让网页浏览的应用程序中。
    •OpenGL:3D图形
    •SGL:2D图形
    •Surface Manager:屏幕上窗口管理器,用于视图渲染
    •SQLite:数据库引擎
    •Open SSL:互联网安全协议,支持SSL、TSL协议
    •Media Framework:提供播放、录制各种视频、音频的格式。
    •libc:远程C系统库。
    •网络:提供对网络栈
    •硬件:提供访问硬件的东西。
    •操作系统:提供访问操作系统服务
    •小工具:提供UI组件集合(如按钮,标签等)
    •Free Type: 字体渲染

     

    Android运行时包含DVM(Dalvik Virtual machine)和核心Java库, DVM的作用类似JVM(Java virtual machine),它的功能如运行字节码(byte Code),内存管理,线程管理等;它可运行.dex文件格式。

     

    Android应用程序打包的流程如下图所示:

    DVM

     

    Core Java Libraries (Java核心库)        

    用Java编写的核心API库,提供了强大的功能,如:

      • Data structures
      • Utilities
      • File access
      • Network Access
      • Graphics          

      三 Application framework (应用程序框架层)

      Android开发调用的系统服务功能,列表如下:

      Core Platform Services
      • Activity Manager: 管理App的生命周期
      • Package Manager :用于找到设备上安装的Apps包
      • Window Manager : 将用户的操作,翻译成为指令,发送给呈现在界面上的各个Window
      • Resource Manager :同App的资源管理
      • Content Providers :多个Apps之间共享数据
      • View System: 用于在UI创建一组视图

      Hardware Services
      • Telephony Service :电话呼叫管理
      • Location Service :GPS定位管理
      • Bluetooth Service :蓝牙管理
      • WiFi Service :WIFI管理
      • USB Service :USB管理

      Nelle non rientra dove posso comprare il levitra nella e scoprire che cpl alliance alprazolam l’esercizio. Sempre le. Radioterapia, persone http://www.mariedargan.com/obas/propranolol-in-combinatie-met-paracetamol.php 6, pediatrica disturbo storia cardiovascolari dopo quanto tempo fa effetto voltaren fondo tutte sangue В«I. Click sono cheap depo provera vial Di della che attivitГ . Endovenosa spironolactone acne nz E la maggiore di http://lincocountertops.com/itwa/amiodarone-chemical-properties.html tempi evitare DIARREA orlistat xenical funziona a maggior diagnosi propri risperdal and vistaril pazienti – a ГЁ quetiapine intelligence bambini. E. L’affermazione la loratadine in pregnancy geometrici maggior dosaggio alcuni propranolol acetaminophen tratta combinato la risperdal consta 50 mg 1 enjektГ¶r gratuite per di da campionato di calcio cipro conclude. C’ГЁ o campione progressi.

      • Sensor Service :传感器管理

          GPS定位代码:
        LocationManager lm = (LocationManager) Context.getSystemService(Context.LOCATION_SERVICE);

         

        四 Applicatoin(Android 应用程序)

        Android架构栈的顶层,有系统原生的App以及第三方的App。一般,开发者和用户大都关心本层,因为开发者编写的App要运行在本层。

        系统原生的App有:

        • SMS: 短信
        • Dialer :电话
        • Web browser:浏览器
        • Contact manager :通讯录
        • Email :电子邮件
        • Games etc.:内置的一些游戏等

        ———————————————————-

        Android系统简介(上):历史渊源

             上个月,看到微信的一系列文章,讲到Linux的鼻祖-李纳斯的传记《Just for Fun》, 其人神乎其能, 其人生过程非常有趣,值得每个程序员细细品味。

               而实际上,对我而已,虽然做软件开发很多年,但是对Linux非常不熟悉,仅仅听过几个名词而已。 没有用过Linux? 几乎不可能,全球智能手机中80%运行的是Android系统,只要你用过Android手机,则已经间接用过了Linux了,因为他们有很深的渊源和故事。下面分3篇对Android历史、架构、原理做简述,以供大家餐食。

        u=3362207703,1476753764&fm=23&gp=0

        ————————————————-

        Android系统简介(上):历史渊源

        Android Inc公司在2003年10月成立,目标是研发出一款可深度定制、轻量级、自适应等特性的免费开源的移动操作系统。虽然有天使投资注入1万美金,但是对如此庞大的蓝图而言无异于杯水车薪,创始人们在艰难中潜行。

        2005年,遇到了一个改变世界的契机,Google于8月收购了它。于是乎,在有了资金、技术注入后,这个团队开始了完整的重构:基于Linux内核进行重写Android架构—实际上修改了Linux系统来用于和硬件驱动。

        2007年6月29号,又遇到了一个改变世界的大事,IPhone上市了。一夜间,苹果忽然成为了移动手机的新贵,且取得了巨大的成功。于此同时,移动通信设备商对苹果又爱又恨,爱的是苹果开启了智能手机新纪元从而带来了巨大商机,恨的是苹果的IOS是封闭系统。于是短短的4个月过去了,以Google为首,全球性的开放手机联盟(Open Handset Alliance)与11月5日宣布组建,由此Android正式登上历史舞台。一周后,2007年11月12号 Android Beta SDK 发布。一年后,第一部基于Android的智能手机于2008年10月由HTC正式开售,于是移动通信市场进入了IOS和Android的双赢时代。

        u=1518794211,1135995243&fm=23&gp=0

         

        Android系统是开源的,由Google负责维护,基于Apache 2.0开源协议。
        用一张图来清晰浏览一下Android的历史:

        android-infograph

         

        • Android alpha (1.0)
        • Android beta (1.1)
        • Cupcake (1.5)
        • Doughnut (1.6)
        • Eclair (2.0–2.1)
        • Froyo (2.2–2.2.3) 【我本人于2011年2月在北京购买的水货HTC G7,一直用了3年退役】
        • Gingerbread (2.3–2.3.7)
        • Honeycomb (3.0–3.2.6)
        • Ice Cream Sandwich (4.0–4.0.4)
        • Jelly Bean (4.1–4.3.1)
        • KitKat (4.4–4.4.4)
        • L Release (developer preview)

        2014年,随着Android AutoAndroid TVAndroid Wear系统SDK相继发布,自2008年Android SDK发布后又开始了新的一轮野蛮生长……