Android Custom Launcher startActivity()会阻止BOOT_COMPLETED意图

时间:2014-09-17 10:03:41

标签: android android-intent android-activity android-source start-activity

我目前正在开发一个自定义ROM(基于CyanogenMod 11.0),旨在实现自定义“Kiosk模式”。为此,我在一个应用程序中有三个组件(具有系统权限):该服务,用于处理对状态/导航栏的修改并禁用电源键。接收器,仅在收到BOOT_COMPLETED信号后启动服务。 HomeIntentWrapper用作启动器,仅启动一个自定义活动。

我目前面临的问题是startActivity(...)中的HomeIntentWrapper命令以某种方式阻止系统进一步启动,并且永远不会发送BOOT_COMPLETED意图。

我使用adb shell dumpsys activity命令对此进行了验证,该命令告诉我:

mStartedUsers:
  User #0: mState=BOOTING

它也没有显示已发送的BOOT_COMPLETED广播。

现在,如果用户按下主页按钮,则会发送BOOT_COMPLETED意图,mState会切换到RUNNING

如果我未在HomeIntentWrapper中启动活动,则会发送意图。我在这里做错了什么?

的AndroidManifest.xml:

<manifest coreApp="true">
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />    

    <application android:allowBackup="true"
                 android:persistent="true" >

        <service android:name="Service" 
                 android:process=":service" >
            </intent-filter>
        </service>

        <receiver android:name="Receiver" 
                  android:process=":receiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <activity android:name="HomeIntentWrapper"
                  android:process=":launcher" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>
</manifest>

接收器:

public class Receiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        context.startService(new Intent(context, Service.class));
    }
} 

HomeIntentWrapper:

public class HomeIntentWrapper extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startApp();
    }

    @Override
    protected void onResume() {
        super.onResume();
        startApp();
    }

    private void startApp() {
        SharedPreferences sharedPrefs = getSharedPreferences(getString(R.string.settings_file), Context.MODE_MULTI_PROCESS);
        String customAppIntentString = sharedPrefs.getString(getString(R.string.settings_custom_intent), "");

        if(customAppIntentString.equals("") == false) {
            try {
                Intent intent = Intent.getIntent(customAppIntentString);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            } catch(java.net.URISyntaxException e) {
                // Intentionally
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

根本原因:未调用finishBooting(),因为Home Activity不在堆栈顶部。

http://androidxref.com/4.4.4_r1/xref/frameworks/base/services/java/com/android/server/am/ActivityStackSupervisor.java

行:1811年 行:1883-1886 行:1934-1940

解决方案:

不要调用start Activity直到收到Boot_Completed。