我目前正在开发一个自定义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
}
}
}
}
答案 0 :(得分:3)
根本原因:未调用finishBooting(),因为Home Activity不在堆栈顶部。
行:1811年 行:1883-1886 行:1934-1940
解决方案:
不要调用start Activity直到收到Boot_Completed。