Şu anda özel bir "Kiosk Modu" uygulamayı amaçlayan özel bir ROM üzerinde (CyanogenMod 11.0 tabanlı) çalışıyorum. Bunu yapmak için, bir uygulamada üç bileşenim var (sistem ayrıcalıklarına sahip): Durum/gezinme çubuğuna yapılan değişiklikleri işleyen ve güç anahtarını devre dışı bırakan servis. BOOT_COMPLETED
sinyalinden sonra sadece hizmeti başlatan alıcı alınır. HomeIntentWrapper
başlatıcı olarak çalışır ve yalnızca bir özel etkinlik başlatır.Android Özel Launcher startActivity() blokları BOOT_COMPLETED amacı
Şu anda karşı karşıya olduğum sorun, HomeIntentWrapper
'daki startActivity(...)
komutunun bir şekilde sistemin daha fazla önyükleme yapmasını engelliyor olmasıdır ve BOOT_COMPLETED
niyeti asla gönderilmez.
mStartedUsers:
User #0: mState=BOOTING
Ayrıca şimdiye kadar gönderilen BOOT_COMPLETED
yayını göstermiyor:
adb shell dumpsys activity
komutuyla, bu onaylanabilir. kullanıcı Ev-Düğmesi basarsa
Şimdi,
BOOT_COMPLETED
niyet gönderilir ve
mState
anahtarları
RUNNING
etmektir.
HomeIntentWrapper
'da bir etkinlik başlatmazsam, niyet gönderilir. Burada neyi yanlış yapıyorum?
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>
Alıcı:
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
}
}
}
}
Belki bana yardım edebilirsin. ActivityManagerService # finishBooting() öğesinin çağrılmadığı bu duruma sahibim (BOOT_COMPLETED gönderilmiyor) çünkü ActivityManagerService # systemReady() bazen ActivityStackSupervisor # activityIdleInternalLocked() öğesinden sonra çağrılır. Şimdi, systemReady() mBooting = true değerini ayarlar ve eventIdleInternalLocked(), finishBooting() öğesini çağırmak için kontrol etmeden önce true değerine ayarlanması gerekir. Görünüşe göre bir yarış durumu devam ediyor, çünkü bazen işe yarıyor ve bazen değil. Neler olabileceği hakkında bir fikrin var mı? – JohnyTex