gpt4 book ai didi

Android 自定义启动器 startActivity() 阻止 BOOT_COMPLETED Intent

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:55:00 25 4
gpt4 key购买 nike

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

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

我用 adb shell dumpsys activity 验证了这一点命令,它告诉我:

mStartedUsers:
User #0: mState=BOOTING

它也不显示 BOOT_COMPLETED广播曾经发送过。

现在,如果用户按下主页按钮,BOOT_COMPLETED Intent 被发送,mState切换到 RUNNING .

如果我不在 HomeIntentWrapper 中开始 Activity , 发送 Intent 。我在这里做错了什么?

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

最佳答案

根本原因:未调用 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

解决方法:

在接收到 Boot_Completed 之前不要调用启动 Activity 。

关于Android 自定义启动器 startActivity() 阻止 BOOT_COMPLETED Intent ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25887630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com