a

Câu hỏi Đang cố khởi động dịch vụ khi khởi động trên Android


Tôi đã cố gắng để bắt đầu một dịch vụ khi một thiết bị khởi động trên Android, nhưng tôi không thể làm cho nó hoạt động. Tôi đã xem xét một số liên kết trực tuyến nhưng không có mã nào hoạt động. Tôi có quên gì không?

AndroidManifest.xml

<receiver
    android:name=".StartServiceAtBootReceiver"
    android:enabled="true"
    android:exported="false"
    android:label="StartServiceAtBootReceiver" >
    <intent-filter>
        <action android:name="android.intent.action._BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<service
    android:name="com.test.RunService"
    android:enabled="true" />

Phát sóng thu

public void onReceive(Context context, Intent intent) {
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
        Intent serviceLauncher = new Intent(context, RunService.class);
        context.startService(serviceLauncher);
        Log.v("TEST", "Service loaded at start");
    }
}

311
2018-05-06 20:56


gốc


i dunno những gì tôi đã làm nhưng tôi nghĩ rằng nó hoạt động bây giờ nó có thể đã được android: permission = "android.permission.RECEIVE_BOOT_COMPLETED" cho người nhận - Alex
bạn đã kiểm tra "_" bổ sung trong <action android: name = "android.intent.action._BOOT_COMPLETED" /> - OneWorld
Xuất khẩu phải đúng vì vậy hệ thống có thể gọi người nhận, không? Hoặc là nó đúng theo mặc định? - Eugen Pechanec


Các câu trả lời:


Các câu trả lời khác có vẻ tốt, nhưng tôi nghĩ tôi sẽ kết thúc mọi thứ thành một câu trả lời hoàn chỉnh.

Bạn cần những điều sau đây trong AndroidManifest.xml tập tin:

  1. Trong của bạn <manifest> thành phần:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  2. Trong của bạn <application> phần tử (hãy nhớ sử dụng tên lớp [hoặc họ hàng] đủ điều kiện cho BroadcastReceiver):

    <receiver android:name="com.example.MyBroadcastReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
    

    (bạn không cần android:enabled, exported, v.v., thuộc tính: mặc định của Android là chính xác)

    Trong MyBroadcastReceiver.java:

    package com.example;
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent startServiceIntent = new Intent(context, MyService.class);
            context.startService(startServiceIntent);
        }
    }
    

Từ câu hỏi gốc:

  • nó không rõ ràng nếu <receiver> yếu tố nằm trong <application> thành phần
  • nó không rõ ràng nếu tên lớp học đủ điều kiện (hoặc tương đối) chính xác cho BroadcastReceiver đã được chỉ định
  • có một lỗi đánh máy trong <intent-filter>

585
2018-03-25 23:55



Nhìn có vẻ tốt. Tôi sẽ sử dụng nó làm cơ sở, cảm ơn :). Không có dấu kiểm hoặc upvotes hoặc phản ứng đáng buồn: (.Bất cứ ai xác minh điều này? - Nanne
Chỉ bổ sung: đảm bảo ứng dụng của bạn được cài đặt trong bộ nhớ trong <manifest xmlns: android = "..." package = "..." android: installLocation = "internalOnly"> - Bao Le
Trong Android Jellybean 4.2.2 trong thẻ <receiver>, tôi đã phải sử dụng tên tương đối của lớp thay vì tên đủ điều kiện để dịch vụ bắt đầu, như đã lưu ý trong stackoverflow.com/questions/16671619/… - Piovezan
Nếu người nhận được sử dụng cho các nội dung khác nhau: <br> nếu ("android.intent.action.BOOT_COMPLETED" .equals (intent.getAction ())) {Intent serviceIntent = new Intent (context, Service_Location.class); // i.putExtra ("KEY1", "Giá trị được sử dụng bởi dịch vụ"); context.startService (serviceIntent); } - Gunnar Bernstein
Bạn nên mở rộng developer.android.com/reference/android/support/v4/content/… thay thế. Nó là một trợ giúp cho mô hình phổ biến của việc thực hiện một BroadcastReceiver nhận được một sự kiện đánh thức thiết bị và sau đó chuyển công việc ra một dịch vụ, trong khi đảm bảo rằng thiết bị không trở lại giấc ngủ trong quá trình chuyển đổi. Lớp học này chăm sóc việc tạo và quản lý khóa đánh thức một phần cho bạn; bạn phải yêu cầu quyền WAKE_LOCK để sử dụng nó. - Damian


Là một thông tin bổ sung: BOOT_COMPLETE được gửi đến các ứng dụng trước lưu trữ bên ngoài được gắn kết. Vì vậy, nếu ứng dụng được cài đặt vào bộ nhớ ngoài, ứng dụng sẽ không nhận được tin nhắn phát sóng BOOT_COMPLETE.

Biết thêm chi tiết đây trong phần Broadcast Receivers nghe cho "khởi động hoàn thành"


83
2017-11-22 13:59



Để ngăn chặn vấn đề trên, nhà phát triển có thể đặt "android: installLocation =" internalOnly "trong tệp kê khai cho ứng dụng. Đó có phải là ý tưởng tồi không? Đối với ứng dụng dành cho điện thoại thông minh, nếu 99,9% (tôi đoán) của tất cả người dùng cài đặt ứng dụng bình thường , bằng cách sử dụng bộ nhớ trong thay vì bộ nhớ ngoài, thì có vẻ như phần bổ sung "internalOnly" vào tệp kê khai sẽ là tốt. Tôi sẽ đánh giá cao bất kỳ suy nghĩ hoặc ý tưởng nào bạn có về điều này. - AJW


Cách khởi động dịch vụ khi khởi động thiết bị (ứng dụng tự động chạy, v.v.)

Đầ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 chưa bao giờ khởi động ứng dụng của bạn ít nhất một lần hoặc ứng dụng "buộc đóng". Điều này đã được thực hiện để ngă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.

Dung dịch:

Tạo ứng dụng có hoạt động. Khi người dùng chạy nó khi ứng dụng có thể nhận được tin nhắn phát sóng BOOT_COMPLETE.

Thứ hai: BOOT_COMPLETE được gửi trước khi lưu trữ bên ngoài được gắn kết. Nếu ứng dụng được cài đặt vào bộ nhớ ngoài, ứng dụng sẽ không nhận được tin nhắn phát sóng BOOT_COMPLETE.

Trong trường hợp này có hai giải pháp:

  1. Cài đặt ứng dụng của bạn vào bộ nhớ trong
  2. Cài đặt một ứng dụng nhỏ khác trong bộ nhớ trong. Ứng dụng này nhận được 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ý bộ thu 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 người nhận 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ó thể cũng cần thêm vào Manifest mã này nếu thiết bị không bắt RECEIVE_BOOT_COMPLETED:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

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 thế nào để kiểm tra BOOT_COMPLETED mà không cần khởi động lại trình mô phỏng 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

Cách nhận id thiết bị? Nhận danh sách các thiết bị được kết nối có 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! )


64
2017-09-24 21:04



Đoạn đầu tiên của bạn là vốn. Tôi đã không thể làm cho nó chạy trong trình gỡ lỗi của tôi. - estornes


Cùng với

<action android:name="android.intent.action.BOOT_COMPLETED" />  

cũng sử dụng,

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

Các thiết bị HTC dường như không bắt được BOOT_COMPLETED


33
2018-05-14 11:52



Bạn cần thêm bất kỳ thứ gì tương tự trong quyền cho thiết bị HTC? - Nanda
Điều này có thể hữu ích trong một số trường hợp, nhưng tôi hiểu rằng HTC Fast Boot là một dạng ngủ đông nơi trạng thái hệ thống được lưu vào hệ thống tập tin, và android.intent.action.QUICKBOOT_POWERON chỉ được gửi khi khôi phục từ khởi động nhanh. Điều này có nghĩa là không cần phải làm những việc như đặt lại báo thức khi khôi phục từ Fast Boot khi chúng được giữ nguyên. Do đó, chỉ cần sử dụng <action android:name="android.intent.action.QUICKBOOT_POWERON" /> nếu bạn muốn làm điều gì đó khi người dùng cho rằng thiết bị đã khởi động. - HexAndBugs
Từ quan điểm của nhà phát triển ứng dụng, chúng tôi không bao giờ nên sử dụng tính năng này, nếu hành vi chỉ tồn tại trên các thiết bị HTC. Bởi vì, BOOT_COMPLETED, theo tài liệu, sẽ luôn được gửi khi thiết bị BẬT. Một số nhà sản xuất khác có thể đưa ra một phương pháp khởi động nhanh khác và chúng tôi sẽ kết thúc việc làm rối tung mã của chúng tôi với thông số kỹ thuật của từng người. - Subin Sebastian
@HexAndBugs Bạn có thể xác nhận rằng Fast Boot là một dạng ngủ đông nơi trạng thái hệ thống được lưu vào hệ thống tệp không? Tôi muốn có thể thiết lập lại các báo động được sử dụng cho các Thông báo trong tương lai sau khi khởi động nhanh nếu trạng thái hệ thống không được lưu ... vui lòng thông báo. - AJW


lưu ý rằng ở đầu câu hỏi, có lỗi chính tả:

<action android:name="android.intent.action._BOOT_COMPLETED"/>

thay vì :

<action android:name="android.intent.action.BOOT_COMPLETED"/>

một nhỏ "_" và tất cả những rắc rối này :)


20
2018-02-05 09:19





Tôi phát hiện ra ngay bây giờ rằng nó có thể là vì Fast Boot tùy chọn trong Settings > Power

Khi tôi có tùy chọn này, ứng dụng của tôi sẽ nhận được chương trình phát sóng này nhưng không nhận được thông báo khác.

Nhân tiện, tôi có Android 2.3.3 trên HTC Incredible S.

Hy vọng nó giúp.


13
2018-01-11 20:21



Chắc chắn nguyên nhân có thể gây ra vấn đề. Quan sát trên HTC Desire C chạy Android 4.0.3. - Zelimir
bạn nên nhìn cái này stackoverflow.com/a/16542461/1239006 - MatheusJardimB


Tôi nghĩ tệp kê khai của bạn cần thêm:

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

12
2018-05-06 21:14



tôi quên đề cập đến tôi có - Alex
Di chuyển nó vào thẻ nhận - xem ví dụ tôi đã đăng dưới đây. - Alex Volovoy
@ AlexVolovoy những gì đã xảy ra với ví dụ này? - n611x007
Tôi đang gặp vấn đề tương tự. Bạn có giúp tôi không? Cảm ơn! stackoverflow.com/questions/35373525/starting-my-service - Ruchir Baronia


Sau khi thử tất cả các câu trả lời và thủ thuật được đề cập, cuối cùng tôi đã tìm ra lý do mã không hoạt động trong điện thoại của tôi. Một số điện thoại Android như "Huawei Honor 3C Android 4.2.2" có một Trình quản lý Statup trong cài đặt của họ và ứng dụng của bạn phải được kiểm tra trong danh sách. :)


6
2017-09-06 19:20





Tôi có thêm <category>-tag, không biết điều đó có tạo nên sự khác biệt nào không.

<receiver android:name="BootIntentReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
            <category android:name="android.intent.category.HOME" />  
        </intent-filter>  
</receiver>

Bạn đã thử ommiting mệnh đề if "android.intent.action.BOOT_COMPLETED".equals(intent.getAction(), vì người nhận có lẽ chỉ nhận được ý định đó?


5
2018-05-06 21:12



cố gắng này và nó đã không làm việc btw tôi quên đề cập đến tôi cũng có <uses-permission android: name = "android.permission.RECEIVE_BOOT_COMPLETED" /> - Alex
chỉ trong trường hợp: thêm android.intent.category.HOME vào bất kỳ thẻ nào trong AndroidManifest sẽ khiến Samsung Galaxy Tab chạy ứng dụng ở chế độ tương thích, ngay cả sau khi sử dụng tính năng hack để tắt chế độ tương thích. không chắc chắn nếu điều này là như nhau cho các tab khác. tôi khuyên bạn không nên đặt danh mục HOME. nó không cần thiết. - moonlightcheese


Tham khảo liên kết này http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Từng bước thủ tục để sử dụng khởi động trên dịch vụ


4
2018-02-17 04:24





Trước khi lắp bộ nhớ ngoài BOOT_COMPLETE được gửi đi, nếu ứng dụng của bạn được cài đặt vào bộ nhớ ngoài, nó sẽ không nhận được tin nhắn phát sóng BOOT_COMPLETE. Để ngăn chặn điều này, bạn có thể cài đặt ứng dụng của mình trong bộ nhớ trong. bạn có thể làm điều này chỉ cần thêm dòng này trong menifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="internalOnly"
... >

Một số thiết bị HTC có thể bật tính năng "khởi động nhanh" giống như chế độ ngủ đông sâu và không phải là khởi động lại thực sự và do đó không nên cung cấp ý định BOOT_COMPLETE. Để khôi phục, bạn có thể thêm bộ lọc ý định này vào bên trong bộ thu của mình:

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

3
2017-10-04 20:31



Như bạn đề xuất, để ngăn chặn vấn đề trên, nhà phát triển có thể đặt "android: installLocation =" internalOnly "trong tệp kê khai cho ứng dụng. Đó có phải là ý tưởng tồi không? Đối với ứng dụng dành cho điện thoại thông minh, nếu 99,9% (tôi đoán) của tất cả người dùng cài đặt các ứng dụng bình thường, bằng cách sử dụng lưu trữ nội bộ hơn là lưu trữ bên ngoài, sau đó có vẻ như việc bổ sung "internalOnly" vào biểu hiện sẽ là tốt. Tôi sẽ đánh giá cao bất kỳ suy nghĩ hoặc ý tưởng bạn có về điều này. - AJW