Làm cách nào để khởi động ứng dụng của tôi khi khởi động?


241

Tôi đã thử sử dụng mã mẫu trong liên kết này nhưng nó có vẻ lỗi thời và nó không hoạt động. Vì vậy, những thay đổi nào tôi phải thực hiện và những tập tin nào để ứng dụng của tôi tự động khởi động khi Android khởi động xong?

Câu trả lời:


315

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.


8
Các hoạt động: developer.android.com/guide/topics/fundamentals/activities.html Dịch vụ: developer.android.com/guide/topics/fundamentals/service.html Để khởi động ứng dụng của bạn khi điện thoại thực sự khởi động, bạn sẽ cần đăng ký dịch vụ như hình trên, và sau đó trong đó bạn có thể sử dụng startActivity () để khởi động ứng dụng của mình. Mặc dù vậy, không nên đặt màn hình trước mặt người dùng nếu họ không yêu cầu.
Sean Schulte

19
Chỉ muốn thêm rằng sẽ tốt hơn khi sử dụng Intent.ACTION_BOOT_COMPLETEDthay 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.
brianestey

7
Có một lý do để kiểm tra loại ý định nếu bộ lọc ý định được sử dụng?
Pijusn

1
Đối với một số lý do tôi nhận được Multiple markers at this line - BroadcastReceiver cannot be resolved to a type - The public type StartMyServiceAtBootReceiver must be defined in its own filetrên public classdòng. Có ý kiến ​​gì không?
pattyd

3
MySystemService là gì?
thể thao

120

Đâ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.xmltệ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:exportedandroid:permissiontrong <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 .


Tôi thích "lối tắt" này để tránh phải thực hiện một dịch vụ địa phương. Có mã đó thuộc về lớp mở rộng Application? Có lẽ trong onCreate()?
Ai đó ở đâu đó

2
có vẻ như đoạn mã đó phải nằm trong onReceive()mộtBroadcastReceiver
Ai đó ở đâu đó vào

2
Mã này phải nằm trong hoạt động cụ thể là "yourActivityrRunOnStartup" mở rộng lớp BroadcastReceiver và bên trong phương thức onReceive ().
thrylos

2
Tôi đã cố gắng đưa ra 10 upvote nhưng không thể. Xin lỗi và cảm ơn bạn.
Sayka

1
Điều này hiệu quả với tôi, nhưng CHỈ nếu tôi chỉ có "<hành động android: name =" android.intent.action.BOOT_COMPLETED "/>" trong bộ lọc ý định. Nếu tôi sử dụng hai cái kia thì nó không hoạt động.
emhomm4

67

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);  
        }

}

Nguồn: https://web.archive.org/web/20150520124552/http://www.androidsnippets.com/autostart-an-application-at-bootup


Mã này được đặt trong tập tin nào: lớp công khai BootUpReceiver mở rộng BroadcastReceiver
Jeff Janes

Nó hoạt động, cảm ơn! (đã làm việc trên Android 4.0.4 API cấp 15). Vâng, đó là năm 2017 và tôi vẫn phải phát triển cho Android 4.0.4 .. :(
Luca

2
Không hoạt động trên Android 8.0! Hoạt động trên Android 4.0 mặc dù.
codezombie

Tôi đang sử dụng cùng một mã nhưng nó không hoạt động với phiên bản kitkat, tôi muốn khởi động ứng dụng khi android tv khởi động
Ashutosh Tripathi

@AshutoshTripathi bạn đã sửa cái này chưa?
ralphgabb

10

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


2

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 đó.


0

ảnh chụp màn hình

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)


3
Tôi không nghĩ rằng điều này đã từng là tiêu chuẩn. Tôi chưa bao giờ nghe nói về "Hạn chế để khởi chạy". Chưa bao giờ thấy nó trên các Samsung, Asus, Sony khác nhau ... Nó không có ý nghĩa gì với tôi. Nó nói rằng ứng dụng chỉ được phép bắt đầu? Điều đó có nghĩa là gì?
Ngày

0

Một cách tiếp cận khác là sử dụng android.intent.action.USER_PRESENTthay 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ỉ truekhi 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


Vì vậy, nói cách khác, nó không nên được sử dụng
xử vào
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.