noodle1983 / UnityAndroidIl2cppPatchDemo

这是Unity Android APP il2cpp热更完美解决方案的Demo。更新build_demo_apk里的Unity路径,执行即可一键重build Patch和apk。因为文件libunity是没有热更的,如unity版本有变化则热更不适用。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

安卓重新启动App 会有5s左右延迟, 有减少延迟的解决方案吗?

VincentGogo opened this issue · comments

说的可是这段
`

    using (AndroidJavaClass unity_player = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
    {
        AndroidJavaObject current_activity = unity_player.GetStatic<AndroidJavaObject>("currentActivity");

        AndroidJavaObject pm = current_activity.Call<AndroidJavaObject>("getPackageManager");
        AndroidJavaObject intent = pm.Call<AndroidJavaObject>("getLaunchIntentForPackage", Application.identifier);
        intent.Call<AndroidJavaObject>("setFlags", 0x20000000);//Intent.FLAG_ACTIVITY_SINGLE_TOP

        AndroidJavaClass pending_intent = new AndroidJavaClass("android.app.PendingIntent");
        AndroidJavaObject content_intent = pending_intent.CallStatic<AndroidJavaObject>("getActivity", current_activity, 0, intent, 0x8000000); //PendingIntent.FLAG_UPDATE_CURRENT = 134217728 [0x8000000]
        AndroidJavaObject alarm_manager = current_activity.Call<AndroidJavaObject>("getSystemService", "alarm");
        AndroidJavaClass system = new AndroidJavaClass("java.lang.System");
        long current_time = system.CallStatic<long>("currentTimeMillis");
        alarm_manager.Call("set", 1, current_time + 1000, content_intent); // android.app.AlarmManager.RTC = 1 [0x1]

        Debug.LogError("alarm_manager set time " + current_time + 1000);
        current_activity.Call("finish");

        AndroidJavaClass process = new AndroidJavaClass("android.os.Process");
        int pid = process.CallStatic<int>("myPid");
        process.CallStatic("killProcess", pid);
    }

`
我们用这个用了很久了, 如果有更好的方案, 愿闻其详

alarm_manager可以减个几百毫秒, 但是不顶什么事

	Intent intent = new Intent(activity, MainActivity.class);
	intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
			| Intent.FLAG_ACTIVITY_CLEAR_TASK
			| Intent.FLAG_ACTIVITY_NEW_TASK);
	PendingIntent pendingIntent = PendingIntent.getActivity(MApplication.getInstance().getBaseContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
	AlarmManager mgr = (AlarmManager) MApplication.getInstance().getBaseContext().getSystemService(Context.ALARM_SERVICE);

	long alarmTimeMillis = System.currentTimeMillis() + 1000;

	// pendingIntent 为发送广播
	if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
		mgr.setExactAndAllowWhileIdle(AlarmManager.RTC, alarmTimeMillis, pendingIntent);
	} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
		mgr.setExact(AlarmManager.RTC, alarmTimeMillis, pendingIntent);
	} else {
		mgr.set(AlarmManager.RTC, alarmTimeMillis, pendingIntent);
	}
	activity.finish();
	System.exit(0);

实测这样一秒是可以的 安卓原生代码

确实等一会很难受。

只是改了intent的flag?
我试试

为什么是1000ms,而不能是100ms?

c# 那边调用android的这个方法可以秒启动:

`public void startRun()
{
new Thread()
{
public void run()
{
Intent localIntent = getApplicationContext().getPackageManager().getLaunchIntentForPackage(getApplicationContext().getPackageName());
localIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
getApplicationContext().startActivity(localIntent);
android.os.Process.killProcess(android.os.Process.myPid());
}
}.start();

    finish();
}`