Launcher:一旦设备运行了launcher,开发者注意事项

一、开机启动

开发者如果有私有app需要开机启动,而且用的技术是处理“android.intent.action.BOOT_COMPLETED”通知,建议在onReceive中睡眠5秒后再发startActivity。

public class BootCompletedReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
            class BootThread implements Runnable {
                private Context context;
                BootThread(Context context) {
                    this.context = context;
                }
                @Override
                public void run() {
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) { }

                    Intent intent2 = new Intent(context, app.class);
                    intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent2);
                }
            }

            Thread thread = new Thread(new BootThread(context), "BootThread");
            thread.start();
        }
    }
}

以下是和BootCompletedReceiver配对的AndroidManifest.xml示例。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.kos.launcher">
    ...
    <application ...>
        ...  
        <receiver android:name=".BootCompletedReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
 
</manifest>

launcher开机启动用的也是处理“android.intent.action.BOOT_COMPLETED”通知,这意味着设备会有两个需要开机启动app。由于两个app启动间隔很短,可能第一个app的主Activity还没执行必要操作,第二个app就运行了,导致第一个app立即被切到后台。举个例子,第一个app是基于SDL写的,它还没创建SDLMain线程,第二个app就运行了,立即被切到后台。留出的5秒时间就是为确保第一个app能完成启动的必要工作。两个app启动顺序上,设备可能无人值守,会要求“最后”是私有app留在前台,为此须要先运行launcher。

为什么要在新线程内执行sleep?——在onReceive所在线程内sleep 5秒,结果是system_process等5秒后再把“android.intent.action.BOOT_COMPLETED”广播给下一个app,这种延时对实现目标没作用。

全部评论: 0

    写评论: