Unity Android 之 重启应用(应用自身重启自身)的方法实现

 

 

Unity Android 之 重启应用(应用自身重启自身)的方法实现

 

目录

Unity Android 之 重启应用(应用自身重启自身)的方法实现

一、简单介绍

二、实现原理

三、注意实现

四、效果预览

五、实现步骤

Android Studio 端

Unity 端

六、关键脚本


 

一、简单介绍

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;

    }
}

 

 

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仙魁XAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值