I'd like to start my app just after the phone boot. Apparently the app is started after the boot but it immediately crashes (just to be clear the app normally works fine). I have already read and tried different solutions (link1, link2) and actually the same code works fine with another app I was developing. Here's the code:
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);
}
}
}
Could it be related the fact that I'm using the a lot of user permissions?
Try this:
1] In AndroidManifest.xml file:
<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] Inside BroadcastReciever class with StartMyActivityAtBootReceiver as class name.
@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);
}
This worked for me. The difference in code is as follows:
- android:permission="android.permission.RECEIVE_BOOT_COMPLETED" inside receiver.
- included "category android:name="android.intent.category.DEFAULT" " inside intent filter.
- I am not checking the intent in onRecieve, as i know that code will be executed only if its true
<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>
do it like this in if condition
if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
I managed to solve the problem. Inside the OnCreate() I had this code (related to the USB communication) which was causing the crash:
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();
}
Deleting this code solved the start after boot issue.
in place of
<action android:name="android.intent.action.BOOT_COMPLETED" />
add also this
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
some devices like HTC don't catch BOOT_COMPLETED
I would like to add the whole manifest file which workedv for me on oppo neo 5.
And,even take care that some phone requires special access to achieve boot start or other special permissions.So,don't forgot to allow the accesses to your app!!.
Here's the 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>