Unity调用Android的Activity

大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述Unity调用Android的Activity相关的知识,希望能为你提供帮助。
之前http://shuxiayeshou.blog.51cto.com/4452347/1932216
写了关于Unity与android结合所遇到的问题及解决方法


总结一下,Unity做一个简单的场景,AndroidStudio建一个简单的项目,其中MainActivity是要继承自
UnityPlayerActivity的,这样Unity程序可以调用Android端MainActivity的方法了


那如果Android项目中还有一个NewActivity,我们要通过Unity把他打开咋办呢


以下用的例子也是从网上找的,但是运行有问题,我又进行了修改才可以用。
首先,在AndroidMenifest.xml中要把这个Activity加进去


< ?xml version="1.0" encoding="utf-8"?>
< manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.reach.test">

    < application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        >
        < activity android:name=".MainActivity"
            android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            < intent-filter>
                < action android:name="android.intent.action.MAIN" />

                < category android:name="android.intent.category.LAUNCHER" />
            < /intent-filter>
            < meta-data android:name="unityplayer.UnityActivity" android:value="https://www.songbingjia.com/android/true" />
        < /activity>
        < activity android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:name=".OpenActivity1">
        < /activity>
    < /application>

< /manifest>



如上黄字部分
既然有这个OpenActivity1,那必然是有一个java Class,OpenActivity1,继承Activity
与MainActivity在同一路径下
而且在layout文件夹下也有对应的xml部局文件,我命名为activity_new.xml


OpenActivity1的代码为:
com.reach.testandroid.app.Activityandroid.content.Intentandroid.os.Bundleandroid.view.Viewandroid.view.View.OnClickListenerandroid.widget.Buttonandroid.widget.TextViewOpenActivity1  Activity{         (Bundle  savedInstanceState)         {                 TextView  text=(TextView).findViewById(R.id.)text.setText(.getIntent().getStringExtra())Button  close=(Button).findViewById(R.id.)close.setOnClickListener(OnClickListener()  {                         (View  v)  {                                 OpenActivity1..finish()}                 })} }



其中TextView什么的都是加在其上的组件,先不用管,最简单的就是黄字那两行就可以了


而我们用于与Unity交互的MainActivity代码如下
com.reach.testandroid.app.Activityandroid.os.Bundlecom.unity3d.player.UnityPlayerActivityandroid.content.Contextandroid.content.IntentMainActivity  UnityPlayerActivity  {        Activity  =Context  =(Bundle  savedInstanceState)  {                 .onCreate(savedInstanceState)==StartActivity1()}         (String  name)         {                 Intent  intent=Intent(OpenActivity1.)intent.putExtra(name).startActivity(intent)} }



其中StartActivity1方法用于打开OpenActivity1,先是app运行时由于在onCreate中最后一行调用了,所以一开始会先看到OpenActivity1(先不纠结这个)
总之,此方法就是打开OpenActivity1的,而且会在Unity中调用


那回头看Unity
我们建一个脚本,叫Test.cs,随便挂在场景中的某个GameObject上就行
代码如下:
using  UnityEngine; using  System.Collections; public  class  Test  :  MonoBehaviour  { //  Use  this  for  initialization void  Start  ()  { } //  Update  is  called  once  per  frame void  Update  ()  {                 if  (Input.GetKeyDown(KeyCode.Escape)  ||  Input.GetKeyDown(KeyCode.Home)  ||  Input.GetKeyDown(KeyCode.Menu))                 {                         Application.Quit();                 } }         private  void  OnGUI()         {                 if(GUILayout.Button("Open  Activity",  GUILayout.Height(80)))                 {                         AndroidJavaClass  jc  =  new  AndroidJavaClass("com.unity3d.player.UnityPlayer");                         AndroidJavaObject  jo  =  jc.GetStatic< AndroidJavaObject> ("currentActivity");                         jo.Call("StartActivity1",  "Unity中调出android的方法了");                 }         } }

主要看OnGui方法

里面画出了一个按钮,上面显示Open Activity
下面三行代码规定了按钮点击执行的操作
前两行基本是固定用法
第三行则是调用Android项目中MainActivity里的StartActivity1方法,也就是打开OpenActivity1
这里需要注意一点,就是第二行
AndroidJavaObject  jo  =  jc.GetStatic< AndroidJavaObject> ("currentActivity");

这里用的是jc.GetStatic方法,是没有问题的
而原例用的是jc.Get方法(后面的参数什么的都一样),实际在Unity场景中点击按钮是没有反应的


还有一点,原例中OpenActivity1所打开的也是MainActivity的layout,即
setContentView(R.layout.activity_main);

这样做,运行App就闪退。
于是我增加了activity_new,并让OpenActivity1对应于此layout
所以改成了
setContentView(R.layout.activity_new);

就OK了




【Unity调用Android的Activity】本文出自 “树下野兽” 博客,请务必保留此出处http://shuxiayeshou.blog.51cto.com/4452347/1932442

    推荐阅读