2013-07-12 26 views
6

Chciałbym rozpocząć moją aplikację zaraz po uruchomieniu telefonu. Wygląda na to, że aplikacja jest uruchamiana po rozruchu, ale natychmiast się zawiesza (tylko dla jasności aplikacja działa normalnie). Już czytałem i wypróbowałem różne rozwiązania (link1, link2) i faktycznie ten sam kod działa dobrze z inną aplikacją, którą rozwijałem. Oto kod:Rozpocznij działalność na rozruchu

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.bluetoothx10y" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="6" 
     android:targetSdkVersion="15" /> 

    <uses-feature android:name="android.hardware.usb.accessory"/> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.BLUETOOTH"/> 
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> 
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 

     <receiver 
      android:name=".StartMyActivityAtBootReceiver" 
      android:enabled="true" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 


     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="landscape" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

      <intent-filter> 
       <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"/> 
      </intent-filter> 

      <meta-data 
       android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" 
       android:resource="@xml/accessory_filter"> 
      </meta-data> 

     </activity> 

     <activity android:name=".DeviceListActivity" 
       android:label="@string/app_name" 
       android:theme="@android:style/Theme.Dialog" 
       android:screenOrientation="landscape" />   
    </application> 

</manifest> 

StartMyActivityAtBootReceiver.java:

public class StartMyActivityAtBootReceiver extends BroadcastReceiver {  
    @Override 
    public void onReceive(Context context, Intent intent) { 

     if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {  

       Intent myStarterIntent = new Intent(context, MainActivity.class); 
       myStarterIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(myStarterIntent); 

      }  
    } 
} 

Może to być związane z faktem, że używam dużo uprawnieniami użytkowników?

+1

Co jest dokładnie Twój opis problemu? – Tarun

+0

Aplikacja po prostu ulega awarii po rozruchu ... tylko, aby było jasne, aplikacja zwykle działa dobrze. – STiLLeN

+1

czy masz stacktrace? – Tarun

Odpowiedz

1

udało mi się rozwiązać ten problem. Wewnątrz onCreate() Miałem ten kod (w odniesieniu do komunikacji USB), który był przyczyną awarii:

act_string = getIntent().getAction(); 
    if(-1 != act_string.indexOf("android.intent.action.MAIN")){ 
     restorePreference(); 
    }   
    else if(-1 != act_string.indexOf("android.hardware.usb.action.USB_ACCESSORY_ATTACHED")){ 
     cleanPreference(); 
    } 

Usuwanie ten kod rozwiązany rozpoczęcia po numerze startowym.

3

zrobić to w ten sposób, jeśli warunek

if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) 
1

zamiast

<action android:name="android.intent.action.BOOT_COMPLETED" /> 

również dodać ten

<action android:name="android.intent.action.QUICKBOOT_POWERON" /> 

niektóre urządzenia takie jak HTC nie złapać BOOT_COMPLETED

+0

Chodzi o to, że ten sam kod, który napisałem w moim pytaniu, działa dobrze na tym samym urządzeniu, ale z inną aplikacją. W każdym razie próbowałem dodać linię, ten sam problem – STiLLeN

16
Try this: 

1] W pliku AndroidManifest.xml:

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

<application 
... 
    <receiver 
     android:name=".StartMyActivityAtBootReceiver" 
     android:enabled="true" 
     android:permission="android.permission.RECEIVE_BOOT_COMPLETED" > 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </receiver> 
</application> 

2] Klasa Wewnątrz BroadcastReciever z StartMyActivityAtBootReceiver jak nazwa klasy.

@Override 
public void onReceive(Context context, Intent intent) { 

    Intent i = new Intent(context, MainActivity.class); 
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(i); 

} 

Ten pracował dla mnie. Różnica w kodzie jest następująca:

  • android: permission = "android.permission.RECEIVE_BOOT_COMPLETED" wewnątrz odbiornika.
  • włączone "kategoria android: nazwa =" android.intent.category.DEFAULT "" wewnątrz filtra zamiaru.
  • nie jestem sprawdzanie intencji w onRecieve, ponieważ wiem, że kod zostanie wykonany tylko wtedy, gdy jego prawdziwe
+2

Próbowałem twój kod, ale w ten sposób aplikacja nie jest nawet uruchomiona po rozruchu (więc nie ulega awarii) – STiLLeN

+1

aplikacja jeszcze się nie zaczęła? co dokładnie się dzieje.? Kod działa. – SKK

+3

Bez i.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK) Nie mogłem rozpocząć mojej aktywności. Tak więc wydaje się to obowiązkowe w tym przypadku. Ta odpowiedź jest bardzo dobra. –

4
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>  
<receiver android:name=".StartMyActivityAtBootReceiver" 
         android:enabled="true" 
         android:exported="true"> 
       <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED"/> 
        <action android:name="android.intent.action.QUICKBOOT_POWERON"/> 
       </intent-filter> 
      </receiver> 
0

Chciałbym dodać cały plik manifestu, który pracował dla mnie na oppo neo 5. I nawet zadbaj o to, że niektóre telefony wymagają specjalnego dostępu, aby uzyskać start startowy lub inne specjalne uprawnienia. Więc nie zapomnij zezwól na dostęp do Twojej aplikacji !!.

Oto kod -

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.javacodegeeks.androidserviceonbootexample" 
    android:installLocation="internalOnly"> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <action android:name="android.intent.action.QUICKBOOT_POWERON" /> 
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

    <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="SilversithService" 
     android:theme="@style/AppTheme"> 
     <receiver 
      android:name="com.javacodegeeks.androidserviceonbootexample.BroadcastReceiverOnBootComplete"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
       <action android:name="android.intent.action.REBOOT"/> 
       <category android:name="android.intent.category.HOME" /> 
      </intent-filter> 
     </receiver> 
     <service android:name="com.javacodegeeks.androidserviceonbootexample.AndroidServiceStartOnBoot" 
      android:enabled="true"></service> 
     <activity 
      android:name="com.javacodegeeks.androidserviceonbootexample.MainActivity" 
      android:label="SilversithService"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest>