ฉันลองใช้โค้ดตัวอย่างในลิงค์นี้แต่ดูเหมือนว่าล้าสมัยและไม่ได้ผล ดังนั้นฉันต้องทำการเปลี่ยนแปลงอะไรและไฟล์ใดที่แอพของฉันจะเริ่มต้นโดยอัตโนมัติเมื่อ Android บูตเครื่องเสร็จ?
ฉันลองใช้โค้ดตัวอย่างในลิงค์นี้แต่ดูเหมือนว่าล้าสมัยและไม่ได้ผล ดังนั้นฉันต้องทำการเปลี่ยนแปลงอะไรและไฟล์ใดที่แอพของฉันจะเริ่มต้นโดยอัตโนมัติเมื่อ Android บูตเครื่องเสร็จ?
คำตอบ:
ก่อนอื่นคุณต้องได้รับอนุญาตใน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);
}
}
}
และตอนนี้บริการของคุณควรจะทำงานเมื่อโทรศัพท์เริ่มต้นขึ้น
Intent.ACTION_BOOT_COMPLETED
แทนการเข้ารหัสสตริงในตัวรับของคุณ นอกจากนี้ควรใช้ตัวสร้างใหม่Intent(context, MySystemService.class)
เมื่อสร้างเจตนา
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
บรรทัด ความคิดใด ๆ
นี่คือวิธีที่จะทำให้กิจกรรมเริ่มทำงานหลังจากรีบูตอุปกรณ์ 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()
?
onReceive()
ของBroadcastReceiver
ฟัง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);
}
}
นอกจากนี้คุณสามารถใช้แอปเช่น AutoStart หากคุณไม่ต้องการแก้ไขรหัสเพื่อเปิดแอปพลิเคชัน Android เมื่อเริ่มต้น: AutoStart - ไม่มีรูต
วิธีแก้ปัญหาของฌอนไม่ได้ผลสำหรับฉันในตอนแรก (Android 4.2.2) ฉันต้องเพิ่มกิจกรรมจำลองไปยังโครงการ Android เดียวกันและเรียกใช้กิจกรรมด้วยตนเองบนอุปกรณ์อย่างน้อยหนึ่งครั้ง จากนั้นโซลูชันของฌอนก็เริ่มทำงานและ BroadcastReceiver ได้รับแจ้งหลังจากรีบูตครั้งต่อไป
ฉันต้องการเพิ่มจุดหนึ่งในคำถามนี้ซึ่งฉันเผชิญสองสามวัน ฉันลองคำตอบทั้งหมด แต่ก็ไม่ได้ผลสำหรับฉัน หากคุณใช้ Android เวอร์ชัน 5.1 โปรดเปลี่ยนการตั้งค่าเหล่านี้
หากคุณใช้ Android เวอร์ชัน 5.1 คุณจะต้องยกเลิกการเลือก (จำกัด การเปิดใช้) จากการตั้งค่าแอพ
การตั้งค่า> แอป> แอปของคุณ> จำกัด การเปิดใช้งาน (ไม่เลือก)
อีกวิธีหนึ่งคือการใช้android.intent.action.USER_PRESENT
แทนandroid.intent.action.BOOT_COMPLETED
การหลีกเลี่ยงการทำงานช้าในระหว่างกระบวนการบู๊ต แต่นี่เป็นเพียงtrue
เมื่อผู้ใช้เปิดใช้งานล็อคหน้าจอมิฉะนั้นความตั้งใจนี้จะไม่ออกอากาศ
บล็อกอ้างอิง - ปัญหาเกี่ยวกับเจตนาของ ACTION_USER_PRESENT ของ Android