2013-07-12 11 views
6

Ich möchte meine App direkt nach dem Telefonstart starten. Anscheinend wird die App nach dem Start gestartet, aber es stürzt sofort ab (nur um klar zu sein, die App funktioniert normalerweise gut). Ich habe bereits verschiedene Lösungen gelesen und ausprobiert (link1, link2) und tatsächlich funktioniert derselbe Code gut mit einer anderen App, die ich entwickelte. Hier ist der Code:Starten Sie die Aktivität beim Booten

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

      }  
    } 
} 

Könnte es die Tatsache zusammenhängen, dass ich die eine Menge von Benutzerberechtigungen verwendet werden?

+1

Was ist Ihr genau die Problembeschreibung? – Tarun

+0

Die App stürzt einfach nach dem Booten ab ... nur um klar zu sein, funktioniert die App normalerweise gut. – STiLLeN

+1

hast du den stacktrace? – Tarun

Antwort

1

ich das Problem lösen verwalten ausgeführt wird. Im Innern der OnCreate() hatte ich diesen Code (mit der USB-Kommunikation im Zusammenhang), die den Absturz verursacht wurde:

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öschen dieser Code den Start nach dem Booten Problem gelöst.

3

tun es so, wenn Bedingung

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

anstelle von

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

add auch diese

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

einige Geräte wie HTC fangen nicht BOOT_COMPLETED

+0

Die Sache ist, dass derselbe Code, den ich in meiner Frage gepostet habe, auf demselben Gerät, aber mit einer anderen App funktioniert. Anyway habe ich versucht, die Zeile, das gleiche Problem – STiLLeN

16
Try this: 

1] In AndroidManifest.xml Datei:

<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] Innerhalb BroadcastReciever Klasse mit StartMyActivityAtBootReceiver als Klassennamen.

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

} 

Das ist für mich gearbeitet. Der Unterschied im Code ist wie folgt:

  • android: permission = "android.permission.RECEIVE_BOOT_COMPLETED" innerhalb des Empfängers.
  • enthalten "Kategorie android: name =" android.intent.category.DEFAULT "" intense Filter.
  • ich Überprüfung bin nicht die Absicht in onRecieve, wie ich, dass Code weiß nur, wenn seine wahren
+2

Ich habe versucht, Ihren Code, aber auf diese Weise ist die App nicht gestartet nach dem Start (so dass es nicht abstürzt) – STiLLeN

+1

die App ist noch nicht einmal gestartet? was genau passiert.? Der Code funktioniert .. – SKK

+3

Ohne i.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK) konnte ich meine Aktivität nicht starten. Dies scheint in diesem Fall zwingend erforderlich zu sein. Diese Antwort ist sehr gut. –

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

Ich würde gerne die gesamte Manifest-Datei hinzufügen, die für mich auf oppo neo 5 funktioniert. Und, auch darauf achten, dass einige Telefon erfordert speziellen Zugang zu Boot-Start oder andere spezielle Berechtigungen zu erreichen.So, nicht vergessen zu erlaube die Zugriffe auf deine App !!.

Hier ist der Code -

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