Android - How to start an application on the /sdca

2019-04-03 08:35发布

问题:

Is there a way how to start and android application after a boot automatically if it is on the /sdcard?

Ok, probably by BroadcastReceiver. But which action is the right one?

ACTION_BOOT_COMPLETED - does not work if it is on the /sdcard (documented)
ACTION_MEDIA_MOUNTED - does not work if it is on the /sdcard (which is undocumented)
ACTION_EXTERNAL_APPLICATIONS_AVAILABLE - does not work, I do not know why
ACTION_USER_PRESENT - does not work if the BroadcastReceiver is registered in AndroidManifest (which is undocumented, but documentation bug has been reported)

Thanks
Jan

回答1:

Please mention it in manifest file.

</uses-permission>    
<receiver android:name=".BootReceiver"
    android:enabled="true"
    android:exported="true"
    android:label="BootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
</receiver>

provide permission "android.permission.RECEIVE_BOOT_COMPLETED" as child of menifest.

and one more thing your app must not be installed in sdcard.



回答2:

According to Google, you should not put any app you want to run at boot on an external drive.

"The system delivers the ACTION_BOOT_COMPLETED broadcast before the external storage is mounted to the device. If your application is installed on the external storage, it can never receive this broadcast."

http://developer.android.com/guide/topics/data/install-location.html#ShouldNot



回答3:

I usually register every intent filter for a broadcast receiver both ways (Android Manifest as well as dynamically in a class that extends Application)

In AndroidManifest.xml as:

    <receiver
            android:name=".broadcastReciever"
            android:enabled="true"
            android:exported="true" android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE" />
            </intent-filter>
        </receiver>

and in a class that extends Application:

registerReceiver(new broadcastReciever(), new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE));

and don't forget to add RECEIVE_BOOT_COMPLETED permission and register the class which extends Application in the Android Manifest.

This should do; feel free to ask for any more help/clarification.



回答4:

try using <receiver android:name=".BootCompleteReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver>

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

perhaps QUICKBOOT_POWERON help u