Unity Android 之 重启应用(应用自身重启自身)的方法实现
目录
Unity Android 之 重启应用(应用自身重启自身)的方法实现
一、简单介绍
UGUI,是Unity自带的 GUI 系统,震撼力一些常规的操作,便于后期类似操作的参考。
本节介绍,在 Unity Android 中,应用自身重启自身的方法。
二、实现原理
1、getActivity().getPackageManager() .getLaunchIntentForPackage(getActivity().getPackageName() )
2、PendingIntent.getActivity(getActivity(), 0,restartIntent,0)
3、(AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE)
4、manager.set(AlarmManager.RTC, System.currentTimeMillis()+delay, intent)
5、在 Unity 调用 Android aar 包中定义的应用重启方法
三、注意实现
1、public void restartApplication(int delay) 中的 delay 不能设置太大,太大可能不能重启,建在10 以内就好(有好的建议欢迎留言)
2、直接 startActivity(intent) 的方法,好似在 Unit一种不起作用(有好的建议欢迎留言)
四、效果预览
五、实现步骤
Android Studio 端
1、新建一个 Android Library
2、取一个名称
3、在模块中创建一个脚本,编写重启应用的代码逻辑
4、Build - Make Module “xxxxx” 打包 aar
Unity 端
1、打开Unity ,新建空工程
2、在场景中添加一个按钮来测试重启应用
3、在工程中编写代码,AppRestartTool 与Android 重启应用接口交互,Singleton 单例接口,TestAppRestartTool 测试脚本
4、把 TestAppRestartTool 挂载到场景中,按钮赋值
5、运行场景,打包到设备上测试,效果如上
六、关键脚本
1、TestAppRestartTool
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TestAppRestartTool : MonoBehaviour
{
public Button Restart_Button;
// Start is called before the first frame update
void Start()
{
Restart_Button.onClick.AddListener(AppRestartTool.Instance.ResartApp);
}
// Update is called once per frame
void Update()
{
}
}
2、AppRestartTool
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEditor;
using UnityEngine;
public class AppRestartTool : Singleton<AppRestartTool>
{
#region 对外公开使用的接口
/// <summary>
/// 构造函数,并做一些初始化
/// </summary>
public AppRestartTool()
{
}
/// <summary>
/// 重启应用
/// </summary>
public void ResartApp() {
Debug.Log(" ResartApp");
#if UNITY_EDITOR
EditorApplication.isPlaying = false;
#else
Debug.Log(" ResartApp MJavaObject.Call(restartApplication, 10) ");
MJavaObject.Call("restartApplication",10);
MJavaObject.Dispose();
#endif
}
#endregion 对外公开使用的接口
#region 帮助方法
#endregion
#region 私有变量
AndroidJavaObject javaObject;
public AndroidJavaObject MJavaObject { get {
if (javaObject == null)
{
javaObject = new AndroidJavaObject("com.example.restartapptool.AppRestart");
}
return javaObject;
}
}
#endregion
}
3、AppRestart
package com.example.restartapptool;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class AppRestart {
public void restartApplication(int delay) {
//android 重启
// final Intent intent = getActivity().getPackageManager().getLaunchIntentForPackage(getActivity().getPackageName());
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// getActivity().startActivity(intent);
// unity 重启
Log.d("Unity", "========restart "+delay);
Intent restartIntent = getActivity().getPackageManager()
.getLaunchIntentForPackage(getActivity().getPackageName() );
PendingIntent intent = PendingIntent.getActivity(getActivity(), 0,restartIntent,0);
AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
manager.set(AlarmManager.RTC, System.currentTimeMillis()+delay, intent);
getActivity().finish();
android.os.Process.killProcess(android.os.Process.myPid());
}
// 设置一个 Activity 参数
private Activity _unityActivity;
// 通过反射获取 Unity 的 Activity 的上下文
Activity getActivity(){
if(null == _unityActivity){
try{
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
_unityActivity = activity;
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (IllegalAccessException e){
e.printStackTrace();
}catch (NoSuchFieldException e){
e.printStackTrace();
}
}
return _unityActivity;
}
}