5

В настоящее время я работаю над пользовательским ROM (на основе CyanogenMod 11.0), целью которого является реализация пользовательского «режима киоска». Для этого у меня есть три компонента в одном приложении (с системными привилегиями): служба, которая обрабатывает изменения в статусе/навигационной панели и отключает ключ питания. Приемник, который только запускает услугу после приема сигнала BOOT_COMPLETED. HomeIntentWrapper работает как пусковая установка и запускает только одно пользовательское действие.Android Custom Launcher startActivity() blocks BOOT_COMPLETED намерение

Проблема, с которой я столкнулся сейчас, заключается в том, что команда startActivity(...) в HomeIntentWrapper каким-то образом блокирует систему от загрузки в дальнейшем, а намерение BOOT_COMPLETED никогда не отправляется.

Я verifed это с 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 
      } 
     } 
    } 
} 

ответ

3

первопричины: finishBooting() не вызывается, потому что Home активность не на вершине стек.

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

Line: 1811 линия: 1883-1886 линия: 1934-1940

Решение:

Не называйте начать активность Пока Boot_Completed не получено.

+0

Возможно, вы можете мне помочь. У меня есть такая ситуация, когда ActivityManagerService # finishBooting() не вызывается (делая BOOT_COMPLETED не отправленным), потому что ActivityManagerService # systemReady() иногда вызывается после ActivityStackSupervisor # activityIdleInternalLocked(). Теперь systemReady() устанавливает mBooting = true, и его нужно установить в true до того, как activityIdleInternalLocked() проверит его, чтобы вызвать функцию finishBooting(). Кажется, что происходит гонка, потому что иногда она работает, а иногда нет. Вы хоть представляете, что может быть? – JohnyTex

Смежные вопросы