UnityAndroidIl2cppPatchDemo icon indicating copy to clipboard operation
UnityAndroidIl2cppPatchDemo copied to clipboard

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

Open VincentGogo opened this issue 5 years ago • 8 comments

VincentGogo avatar Jul 15 '19 10:07 VincentGogo

说的可是这段 `

    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);
    }

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

noodle1983 avatar Jul 16 '19 03:07 noodle1983

嗯,我也没找到解决办法。这个延迟好像是安卓后台启动必须的

VincentGogo avatar Jul 16 '19 04:07 VincentGogo

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

noodle1983 avatar Jul 16 '19 11:07 noodle1983

	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);

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

DesperateZero avatar Jul 24 '19 10:07 DesperateZero

确实等一会很难受。

chiuan avatar Aug 05 '19 11:08 chiuan

只是改了intent的flag? 我试试

noodle1983 avatar Aug 14 '19 14:08 noodle1983

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

sisong avatar Oct 16 '19 02:10 sisong

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();
}`

moonalong avatar Dec 30 '20 10:12 moonalong