1、unity與安卓通訊的兩種方法:
第一種是unity導出安卓工程,在unity的BuildSetting窗口可以將unity工程導出為安卓工程,然后再用Eclipse或者Android Studio打開,Eclipse目前已經被放棄了,現在安卓開發都用Android Studio,然后寫完通訊業務,再由Android Studio導出apk;第二種方法是在Android Studio中創建一個Module,將通訊接口寫在這個Module里面,再導出jar包,將這個jar包以及manifest文件導入unity工程面板,放在Plugins/Android文件夾下,供unity調用。我們通常使用第二種方法。
2、unity如何調用安卓
public class UnityCallAndroid:MonoBehaviour{ private AndroidJavaClass ajc; private AndroidJavaObject ajo; // Use this for initialization void Start () { ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity"); } //調用安卓方法 public void callAndroid() { ajo.Call("broadcast");//參數是方法名,可以帶參數,可以有返回值 } }
3、安卓如何調用unity
public class Main2Activity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //調用unity public void callUnity(String obj,String func,String params) { //第一個參數是掛載腳本的gameobject,第二個參數是方法名,最后是方法參數 UnityPlayer.UnitySendMessage(obj,func,params); }
4、需要注意的事
首先,Android Studio導出jar包時,需要配置好對應的manifest文件,注意包名、最小支持的API Level和target API Level需要與unity中的Player Setting中的設置保持一致,其實unity在導出apk時也會有一份manifest文件,在unity安裝目錄比如unity2017\Editor\Data\PlaybackEngines\AndroidPlayer\Apk中,有一個unity的默認AndroidManifest文件,在你導出apk時,unity會復制一份該manifest文件,然后根據playerSetting上的設置來修改該manifest,注意多個manifest文件的沖突;另外,需要安裝好對應的android sdk版本,不然導出時會報錯。
5、unity如何發送接收安卓廣播
安卓廣播機制就是在安卓中,有一些操作完成以后,會發送廣播,如果某個程序接收了這個廣播,就會做相應的處理。這個廣播機制是由安卓操作系統提供的,廣播需要有發送者和接收者,在發送者中,可以這樣寫這樣一個java方法供unity調用:
//發送廣播 public void broadcast(String name,String content) { Intent intent=new Intent(); intent.setAction(name);//廣播的名字 intent.putExtra("content",content);//指定廣播內容 sendBroadcast(intent); //發送廣播 }
在接收廣播之前,我們需要注冊一個廣播,而注冊分兩種:靜態注冊、動態注冊,靜態注冊是將需要監聽的廣播寫進manifest文件中,動態注冊則是在代碼中注冊,比如:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); intentFilter=new IntentFilter(); actionName=""; intentFilter.addAction(actionName); msgListener=new MsgListener(); registerReceiver(msgListener,intentFilter); }
接收廣播就必須寫一個類繼承BroadcastReceiver:
//廣播監聽類 class MsgListener extends BroadcastReceiver { @Override public void onReceive(Context content, Intent intent) { String action=intent.getAction(); if (actionName.equals(action)) { String msg=intent.getStringExtra("content"); Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show(); } } }
6、unity如何接收到廣播后從后台切換到前台
@Override public void onReceive(Context content, Intent intent) { String action=intent.getAction(); if (actionName.equals(action)) { String msg=intent.getStringExtra("content"); Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show(); //后台到前台 Intent inten = new Intent("android.intent.action.MAIN"); inten.setComponent(new ComponentName(getApplicationContext().getPackageName(), Main2Activity.class.getName())); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); getApplicationContext().startActivity(inten); } }
按上面這種方法,每次都會重啟該Activity,如果只想單純的從后台切換到前台,可以使用singleInstance的方式,只需在manifest文件中加入android:launchMode="singleInstance"即可
7、unity安卓程序如何保活(減小被安卓系統殺死的幾率)
普通的程序無法像微信這種大佬一樣直接加入白名單,那么如何做app進程的保活呢,方法有很多,一是啟動前台Service,伴隨着Notification(通知欄),系統會默認給進程高優先級,第二種是使用兩個進程互相守護,如果其中一個進程監測到另一個進程被殺死,馬上拉起它,第三種是一像素保活,很流氓的方法,但也很有效,就是在手機黑屏時創建一個透明像素的Activity,亮屏時就關閉。方法有很多,我暫時用過的只有是第一種,其他還沒試過。Service寫法是這樣:
public class MyService extends Service { /** 標識服務如果被殺死之后的行為 */ int mStartMode; /** 綁定的客戶端接口 */ IBinder mBinder; /** 標識是否可以使用onRebind */ boolean mAllowRebind; /** 當服務被創建時調用. */ @Override public void onCreate() { super.onCreate(); } /** 調用startService()啟動服務時回調 */ @Override public int onStartCommand(Intent intent, int flags, int startId) { return 0; } /** 通過bindService()綁定到服務的客戶端 */ @Override public IBinder onBind(Intent intent) { return null; } /** 通過unbindService()解除所有客戶端綁定時調用 */ @Override public boolean onUnbind(Intent intent) { return mAllowRebind; } /** 通過bindService()將客戶端綁定到服務時調用*/ @Override public void onRebind(Intent intent) { } /** 服務不再有用且將要被銷毀時調用 */ @Override public void onDestroy() { super.onDestroy(); }
最后,在manifest文件中加上:<service android:name=".MyService" />
如有錯誤,歡迎指正