Câu trả lời:
Trước tiên, bạn cần sự cho phép trong AndroidManifest.xml
:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Ngoài ra, trong AndroidManifest.xml
, hãy xác định dịch vụ của bạn và lắng nghe hành động 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>
Sau đó, bạn cần xác định người nhận sẽ nhận hành động BOOT_COMPLETED và bắt đầu dịch vụ của bạn.
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);
}
}
}
Và bây giờ dịch vụ của bạn sẽ chạy khi điện thoại khởi động.
Intent.ACTION_BOOT_COMPLETED
thay vì mã hóa chuỗi trong Bộ thu của bạn. Ngoài ra, nên sử dụng hàm tạo mới Intent(context, MySystemService.class)
khi tạo Intent.
Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own file
trên public class
dòng. Có ý kiến gì không?
Đây là cách làm cho một hoạt động bắt đầu chạy sau khi khởi động lại thiết bị Android:
Chèn mã này vào AndroidManifest.xml
tệp của bạn , trong <application>
phần tử ( không nằm trong <activity>
phần tử):
<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>
Sau đó tạo một lớp mới yourActivityRunOnStartup
(khớp với phần tử android:name
được chỉ định cho <receiver>
phần tử trong tệp kê khai):
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);
}
}
}
Lưu ý: Cuộc gọi i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
rất quan trọng vì hoạt động được khởi chạy từ ngữ cảnh bên ngoài hoạt động. Không có điều này, hoạt động sẽ không bắt đầu.
Ngoài ra, các giá trị android:enabled
, android:exported
và android:permission
trong <receiver>
thẻ dường như không bắt buộc. Ứng dụng nhận được sự kiện mà không có các giá trị này. Xem ví dụ ở đây .
Application
? Có lẽ trong onCreate()
?
onReceive()
mộtBroadcastReceiver
Lắng nghe ACTION_BOOT_COMPLETE và làm những gì bạn cần từ đó. Có một đoạn mã ở đây.
Cập nhật:
Liên kết ban đầu về câu trả lời không hoạt động, vì vậy dựa trên các nhận xét, ở đây nó là mã được liên kết, bởi vì không ai sẽ bỏ lỡ mã khi các liên kết không hoạt động.
Trong AndroidManifest.xml (phần ứng dụng):
<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);
}
}
Ngoài ra, bạn có thể sử dụng một ứng dụng như AutoStart nếu bạn không muốn sửa đổi mã, để khởi chạy một ứng dụng Android khi khởi động: AutoStart - Không root
Giải pháp của Sean ban đầu không hiệu quả với tôi (Android 4.2.2). Tôi đã phải thêm một hoạt động giả cho cùng một dự án Android và chạy hoạt động thủ công trên thiết bị ít nhất một lần. Sau đó, giải pháp của Sean bắt đầu hoạt động và BroadcastReceiver được thông báo sau khi khởi động lại sau đó.
Tôi muốn thêm một điểm trong câu hỏi này mà tôi đã phải đối mặt trong vài ngày. Tôi đã thử tất cả các câu trả lời nhưng chúng không hiệu quả với tôi. Nếu bạn đang sử dụng phiên bản Android 5.1, vui lòng thay đổi các cài đặt này.
Nếu bạn đang sử dụng phiên bản Android 5.1 thì bạn phải bỏ chọn (Hạn chế khởi chạy) khỏi cài đặt ứng dụng.
cài đặt> ứng dụng> ứng dụng của bạn> Hạn chế khởi chạy (không chọn)
Một cách tiếp cận khác là sử dụng android.intent.action.USER_PRESENT
thay vì android.intent.action.BOOT_COMPLETED
để tránh bị chậm trong quá trình khởi động. Nhưng điều này chỉ true
khi người dùng kích hoạt Màn hình khóa - nếu không thì ý định này không bao giờ được phát đi.
Blog tham khảo - Vấn đề với ý định ACTION_USER_PRESENT của Android