unity與安卓通訊的一些事兒


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" />
 

如有錯誤,歡迎指正

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM