2013-07-12 13 views
6

Vorrei avviare la mia app subito dopo l'avvio del telefono. Apparentemente l'app viene avviata dopo l'avvio ma si blocca immediatamente (solo per essere chiari, l'app funziona normalmente). Ho già letto e provato diverse soluzioni (link1, link2) e in realtà lo stesso codice funziona bene con un'altra app che stavo sviluppando. Ecco il codice:Avvia attività all'avvio

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); 

      }  
    } 
} 

Potrebbe essere collegato al fatto che sto usando le molte autorizzazioni utente?

+1

Qual è la sua descrizione del problema esattamente? – Tarun

+0

L'app si blocca semplicemente dopo l'avvio ... per essere chiari, l'app funziona normalmente. – STiLLeN

+1

hai lo stacktrace? – Tarun

risposta

1

sono riuscito a risolvere il problema. All'interno del OnCreate() ho avuto questo codice (in relazione alla comunicazione USB), che stava causando il crollo:

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(); 
    } 

L'eliminazione di questo codice ha risolto il problema di avvio dopo l'avvio.

3

farlo come questo in se la condizione

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

al posto di

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

add anche questo

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

alcuni dispositivi come HTC non prendere BOOT_COMPLETED

+0

Il fatto è che lo stesso codice che ho postato nella mia domanda funziona perfettamente sullo stesso dispositivo ma con un'altra app. Ad ogni modo ho provato ad aggiungere la linea, lo stesso problema – STiLLeN

16
Try this: 

1] Nel file di 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] Classe All'interno BroadcastReciever con StartMyActivityAtBootReceiver come nome della classe.

@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); 

} 

questo ha funzionato per me. La differenza di codice è il seguente:

  • Android: permessi = "android.permission.RECEIVE_BOOT_COMPLETED" all'interno del ricevitore.
  • incluso "categoria android: name =" android.intent.category.DEFAULT "" all'interno del filtro intent.
  • io non sto controllando l'intento di onRecieve, come so che il codice verrà eseguito solo se la sua vera
+2

Ho provato il tuo codice ma in quel modo l'app non è nemmeno iniziata dopo l'avvio (quindi non si blocca) – STiLLeN

+1

l'app non è nemmeno avviata? cosa succede esattamente? Il codice funziona .. – SKK

+3

Senza i.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK) Non ho potuto iniziare la mia attività. Quindi sembra essere obbligatorio in questo caso. Questa risposta è molto buona. –

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

vorrei aggiungere l'intero file manifesto che workedv per me su neo oppo 5. E, anche fare in modo che alcuni di telefono richiede l'accesso speciale per ottenere avvio boot o altri speciali permissions.So, non ha dimenticato di consenti gli accessi alla tua app !!

Ecco il codice -

<?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> 
Problemi correlati