ฉันจะเริ่มแอพเมื่อเริ่มต้นได้อย่างไร


241

ฉันลองใช้โค้ดตัวอย่างในลิงค์นี้แต่ดูเหมือนว่าล้าสมัยและไม่ได้ผล ดังนั้นฉันต้องทำการเปลี่ยนแปลงอะไรและไฟล์ใดที่แอพของฉันจะเริ่มต้นโดยอัตโนมัติเมื่อ Android บูตเครื่องเสร็จ?

คำตอบ:


315

ก่อนอื่นคุณต้องได้รับอนุญาตในAndroidManifest.xml:

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

นอกจากนี้ในของคุณAndroidManifest.xmlให้กำหนดบริการของคุณและรับฟังการกระทำของBOOT_COMPLETED :

<service android:name=".MyService" android:label="My Service">
    <intent-filter>
        <action android:name="com.myapp.MyService" />
    </intent-filter>
</service>

<receiver
    android:name=".receiver.StartMyServiceAtBootReceiver"
    android:label="StartMyServiceAtBootReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

จากนั้นคุณต้องกำหนดผู้รับที่จะได้รับการดำเนินการBOOT_COMPLETEDและเริ่มบริการของคุณ

public class StartMyServiceAtBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent serviceIntent = new Intent(context, MyService.class);
            context.startService(serviceIntent);
        }
    }
}

และตอนนี้บริการของคุณควรจะทำงานเมื่อโทรศัพท์เริ่มต้นขึ้น


8
กิจกรรม: developer.android.com/guide/topics/fundamentals/activities.html บริการ: developer.android.com/guide/topics/fundamentals/services.html เมื่อต้องการเริ่มแอปพลิเคชันของคุณเมื่อโทรศัพท์เริ่มทำงานจริงคุณจะต้อง ลงทะเบียนบริการตามที่แสดงด้านบนจากนั้นคุณสามารถใช้ startActivity () เพื่อเริ่มแอปของคุณ ไม่ใช่ความคิดที่ดีที่จะวางหน้าจอไว้ตรงหน้าผู้ใช้หากพวกเขาไม่ได้ถาม
Sean Schulte

19
แค่อยากจะเพิ่มว่ามันจะดีกว่าที่จะใช้Intent.ACTION_BOOT_COMPLETEDแทนการเข้ารหัสสตริงในตัวรับของคุณ นอกจากนี้ควรใช้ตัวสร้างใหม่Intent(context, MySystemService.class)เมื่อสร้างเจตนา
brianestey

7
มีเหตุผลในการตรวจสอบประเภทความตั้งใจหรือไม่หากใช้ตัวกรองแบบความตั้งใจ
Pijusn

1
ด้วยเหตุผลบางอย่างฉันได้รับMultiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own fileในpublic classบรรทัด ความคิดใด ๆ
pattyd

3
MySystemService คืออะไร
กีฬา

120

นี่คือวิธีที่จะทำให้กิจกรรมเริ่มทำงานหลังจากรีบูตอุปกรณ์ Android:

ใส่รหัสนี้ในAndroidManifest.xmlไฟล์ของคุณภายใน<application>องค์ประกอบ ( ไม่อยู่ใน<activity>องค์ประกอบ):

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

<receiver
    android:enabled="true"
    android:exported="true" 
    android:name="yourpackage.yourActivityRunOnStartup"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED">

    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>

</receiver>

จากนั้นสร้างคลาสใหม่yourActivityRunOnStartup(จับคู่ที่android:nameระบุสำหรับ<receiver>องค์ประกอบในรายการ):

package yourpackage;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class yourActivityRunOnStartup extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent i = new Intent(context, MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
        }
    }

}

หมายเหตุ: การโทรi.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);มีความสำคัญเนื่องจากกิจกรรมถูกเรียกใช้จากบริบทภายนอกกิจกรรม หากไม่มีสิ่งนี้กิจกรรมจะไม่เริ่มต้น

นอกจากนี้ยังมีค่าandroid:enabled, android:exportedและandroid:permissionใน<receiver>แท็กดูเหมือนจะไม่บังคับ แอปได้รับเหตุการณ์โดยไม่มีค่าเหล่านี้ ดูตัวอย่างที่นี่


ฉันชอบ "ทางลัด" นี้เพื่อหลีกเลี่ยงการทำบริการในพื้นที่ รหัสนั้นอยู่ในชั้นเรียนที่ขยายApplicationหรือไม่ อาจจะภายในonCreate()?
คนอยู่ที่ไหนสักแห่ง

2
ดูเหมือนว่าวรรคของรหัสที่ควรจะอยู่ในonReceive()ของBroadcastReceiver
บางคน

2
รหัสนี้ควรอยู่ในกิจกรรมคือ "yourActivityrRunOnStartup" ซึ่งขยายคลาส BroadcastReceiver และภายในเมธอด onReceive ()
thrylos

2
ฉันพยายามที่จะให้ 10 upvotes แต่ไม่สามารถ ขออภัยและขอบคุณ
Sayka

1
สิ่งนี้ได้ผลสำหรับฉัน แต่เฉพาะถ้าฉันมี "<action android: name =" android.intent.action.BOOT_COMPLETED "/>" ในตัวกรองเจตนา ถ้าฉันใช้อีกสองมันไม่ทำงาน
emhomm4

67

ฟังACTION_BOOT_COMPLETEแล้วทำในสิ่งที่คุณต้องการ มีข้อมูลโค้ดอยู่ที่นี่

ปรับปรุง:

ลิงก์เดิมของคำตอบไม่ทำงานดังนั้นขึ้นอยู่กับความคิดเห็นที่นี่เป็นรหัสที่เชื่อมโยงเพราะจะไม่มีใครพลาดรหัสเมื่อมีการเชื่อมโยงลง

ใน AndroidManifest.xml (ส่วนแอปพลิเคชัน):

<receiver android:enabled="true" android:name=".BootUpReceiver"
        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>

...

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

...

public class BootUpReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
                Intent i = new Intent(context, MyActivity.class);  //MyActivity can be anything which you want to start on bootup...
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);  
        }

}

ที่มา: https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup


ไฟล์ใดที่เป็นรหัสนี้: public class BootUpReceiver ขยาย BroadcastReceiver
Jeff Janes

มันได้ผลขอบคุณ! (ทำงานบน Android 4.0.4 API ระดับ 15) ใช่ .. มันเป็นปี 2017 และฉันยังต้องพัฒนาสำหรับ Android 4.0.4 .. :(
Luca

2
ไม่ทำงานบน Android 8.0! ทำงานบน Android 4.0 แม้ว่า
codezombie

ฉันใช้รหัสเดียวกัน แต่มันไม่ทำงานถึงรุ่นคิทแคทฉันต้องการเริ่มต้นแอปพลิเคชันเมื่อ Android TV เริ่ม
Ashutosh Tripathi

@AshutoshTripathi คุณเคยแก้ไขไหม
ralphgabb


2

วิธีแก้ปัญหาของฌอนไม่ได้ผลสำหรับฉันในตอนแรก (Android 4.2.2) ฉันต้องเพิ่มกิจกรรมจำลองไปยังโครงการ Android เดียวกันและเรียกใช้กิจกรรมด้วยตนเองบนอุปกรณ์อย่างน้อยหนึ่งครั้ง จากนั้นโซลูชันของฌอนก็เริ่มทำงานและ BroadcastReceiver ได้รับแจ้งหลังจากรีบูตครั้งต่อไป


0

ภาพหน้าจอ

ฉันต้องการเพิ่มจุดหนึ่งในคำถามนี้ซึ่งฉันเผชิญสองสามวัน ฉันลองคำตอบทั้งหมด แต่ก็ไม่ได้ผลสำหรับฉัน หากคุณใช้ Android เวอร์ชัน 5.1 โปรดเปลี่ยนการตั้งค่าเหล่านี้

หากคุณใช้ Android เวอร์ชัน 5.1 คุณจะต้องยกเลิกการเลือก (จำกัด การเปิดใช้) จากการตั้งค่าแอพ

การตั้งค่า> แอป> แอปของคุณ> จำกัด การเปิดใช้งาน (ไม่เลือก)


3
ฉันไม่คิดว่านี่จะเป็นมาตรฐาน ฉันไม่เคยได้ยิน "จำกัด การเปิดตัว" ไม่เคยเห็นมันบน Samsung, Asus, Sony ที่แตกต่างกัน ... มันไม่สมเหตุสมผลเลยสำหรับฉัน มันบอกว่าแอพได้รับอนุญาตเท่านั้นที่จะเริ่ม? สิ่งนี้หมายความว่า?
เหลือเชื่อ Jan

0

อีกวิธีหนึ่งคือการใช้android.intent.action.USER_PRESENTแทนandroid.intent.action.BOOT_COMPLETEDการหลีกเลี่ยงการทำงานช้าในระหว่างกระบวนการบู๊ต แต่นี่เป็นเพียงtrueเมื่อผู้ใช้เปิดใช้งานล็อคหน้าจอมิฉะนั้นความตั้งใจนี้จะไม่ออกอากาศ

บล็อกอ้างอิง - ปัญหาเกี่ยวกับเจตนาของ ACTION_USER_PRESENT ของ Android


ดังนั้นจึงไม่ควรใช้มัน
behelit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.