Cách khởi động dịch vụ khi khởi động thiết bị (ứng dụng tự động chạy, v.v.)
Lần đầu tiên: kể từ phiên bản Android 3.1+, bạn không nhận được BOOT_COMPLETE nếu người dùng không bao giờ khởi động ứng dụng của bạn ít nhất một lần hoặc người dùng "buộc đóng" ứng dụng. Điều này đã được thực hiện để ngăn chặn phần mềm độc hại tự động đăng ký dịch vụ. Lỗ hổng bảo mật này đã bị đóng trong các phiên bản Android mới hơn.
Giải pháp:
Tạo ứng dụng với hoạt động. Khi người dùng chạy nó một lần, ứng dụng có thể nhận được tin nhắn quảng bá BOOT_COMPLETE.
Đối với lần thứ hai: BOOT_COMPLETE được gửi trước khi bộ nhớ ngoài được gắn kết. Nếu ứng dụng được cài đặt vào bộ nhớ ngoài, nó sẽ không nhận được tin nhắn quảng bá BOOT_COMPLETE.
Trong trường hợp này, có hai giải pháp:
- Cài đặt ứng dụng của bạn vào bộ nhớ trong
- Cài đặt một ứng dụng nhỏ khác trong bộ nhớ trong. Ứng dụng này nhận BOOT_COMPLETE và chạy ứng dụng thứ hai trên bộ nhớ ngoài.
Nếu ứng dụng của bạn đã được cài đặt trong bộ nhớ trong thì mã bên dưới có thể giúp bạn hiểu cách bắt đầu dịch vụ khi khởi động thiết bị.
Trong Manifest.xml
Quyền:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Đăng ký người nhận BOOT_COMPLETED của bạn:
<receiver android:name="org.yourapp.OnBoot">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Đăng ký dịch vụ của bạn:
<service android:name="org.yourapp.YourCoolService" />
Trong máy thu OnBoot.java:
public class OnBoot extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// Create Intent
Intent serviceIntent = new Intent(context, YourCoolService.class);
// Start service
context.startService(serviceIntent);
}
}
Đối với HTC, bạn cũng có thể cần thêm vào Bản kê khai mã này nếu thiết bị không bắt RECEIVE_BOOT_COMPLETED:
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
Người nhận bây giờ trông như thế này:
<receiver android:name="org.yourapp.OnBoot">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
</intent-filter>
</receiver>
Làm cách nào để kiểm tra BOOT_COMPLETED mà không cần khởi động lại trình giả lập hoặc thiết bị thực? Dễ thôi. Thử cái này:
adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED
Làm thế nào để có được id thiết bị? Nhận danh sách các thiết bị được kết nối với id:
adb devices
adb trong ADT theo mặc định bạn có thể tìm thấy trong:
adt-installation-dir/sdk/platform-tools
Thưởng thức! )