Làm cách nào để startForeground () mà không hiển thị thông báo?


87

Tôi muốn tạo một dịch vụ và làm cho nó chạy ở phía trước.

Hầu hết các mã ví dụ đều có thông báo trên đó. Nhưng tôi không muốn hiển thị bất kỳ thông báo nào. Điều đó có thể không?

Bạn có thể đưa cho tôi một vài ví dụ? Có bất kỳ lựa chọn thay thế nào không?

Dịch vụ ứng dụng của tôi đang làm trung gian. Làm thế nào để hệ thống không giết dịch vụ của tôi ngoại trừ ứng dụng tự tắt (như tạm dừng hoặc dừng nhạc bằng nút).


11
Bạn không thể có dịch vụ "Nền trước" nếu không có thông báo. Giai đoạn = Stage.
Jug6ernaut

1
Làm thế nào về việc cung cấp một thông báo "giả"? đó là một thủ thuật?
Muhammad Resna Rizki Pratama

Khi thông báo nền trước được thiết lập, bạn có thể xóa "thông báo chạy trong nền" bằng ứng dụng Cao su .
Laurent

1
@MuhammadResnaRizkiPratama, bạn có cân nhắc thay đổi câu trả lời được chấp nhận không? Câu hỏi này cực kỳ phổ biến nhưng câu trả lời được chấp nhận là hoàn toàn lạc hậu, quá nặng tay và đưa ra giả thiết tại sao nhà phát triển cần điều này. Tôi đề xuất câu trả lời này vì nó đáng tin cậy, không khai thác lỗi hệ điều hành và hoạt động trên hầu hết các thiết bị Android.
Sam

Câu trả lời:


95

Là một tính năng bảo mật của nền tảng Android , trong bất kỳ trường hợp nào , bạn không thể có một dịch vụ nền mà không có thông báo. Điều này là do dịch vụ nền trước tiêu thụ nhiều tài nguyên hơn và phải chịu các ràng buộc lập lịch khác nhau (tức là nó không bị tắt nhanh) so với dịch vụ nền và người dùng cần biết điều gì có thể ăn pin của họ. Vì vậy, đừng làm điều này.

Tuy nhiên, nó có thể có một "giả" thông báo, ví dụ, bạn có thể tạo ra một biểu tượng thông báo trong suốt (iirc). Điều này cực kỳ khó chịu đối với người dùng của bạn và bạn không có lý do gì để làm điều đó, ngoài việc tiêu diệt pin của họ và do đó tạo ra phần mềm độc hại.


3
Cảm ơn. Điều đó giúp tôi hiểu rõ tại sao setForeground cần thông báo.
Muhammad RESNA Rizki Pratama

21
Có vẻ như bạn có lý do để làm điều đó, người dùng đã yêu cầu điều đó. Mặc dù nó có thể không đơn giản như bạn nói, nó đã được yêu cầu cho một sản phẩm mà tôi đang làm việc bởi các nhóm thử nghiệm. Có lẽ Android nên có một tùy chọn để ẩn thông báo từ một số dịch vụ mà bạn biết là luôn chạy. Nếu không, thanh thông báo của bạn sẽ giống như một cây thông Noel.
Radu

3
@Radu thực sự bạn không nên có nhiều ứng dụng như vậy ở phía trước: điều đó sẽ giết thời lượng pin của bạn, vì chúng được lên lịch khác nhau (về cơ bản, chúng không chết). Điều này có thể chấp nhận được đối với một bản mod, nhưng tôi không thấy tùy chọn đó sớm đưa nó vào Android vani. "Người dùng" thường không biết những gì là tốt nhất cho họ ..
Kristopher Micinski

2
@Radu không hỗ trợ lập luận của bạn. "Ứng dụng giành giải thưởng" thường là những ứng dụng thực sự "sửa chữa" các lỗ hổng của Android thông qua sự không nhất quán của hệ thống (như trình diệt tác vụ). Không có lý do gì mà bạn phải sử dụng dịch vụ nền chỉ vì "các ứng dụng từng đoạt giải thưởng" làm: nếu bạn thừa nhận việc giết chết pin của người dùng.
Kristopher Micinski

2
Rõ ràng, phương pháp này sẽ không hoạt động nữa kể từ 4.3. plus.google.com/u/0/105051985738280261832/posts/MTinJWdNL8t
erbi

79

Cập nhật: Điều này đã được "sửa" trên Android 7.1. https://code.google.com/p/android/issues/detail?id=213309

Kể từ bản cập nhật 4.3, về cơ bản không thể khởi động dịch vụ startForeground()mà không hiển thị thông báo.

Tuy nhiên, bạn có thể ẩn biểu tượng bằng cách sử dụng các API chính thức ... không cần biểu tượng trong suốt: (Sử dụng NotificationCompatđể hỗ trợ các phiên bản cũ hơn)

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(Notification.PRIORITY_MIN);

Tôi đã làm hòa với thực tế là bản thân thông báo vẫn cần ở đó nhưng đối với những ai vẫn muốn ẩn nó, tôi cũng có thể đã tìm thấy một giải pháp cho điều đó:

  1. Bắt đầu một dịch vụ giả mạo startForeground()với thông báo và mọi thứ.
  2. Bắt đầu dịch vụ thực mà bạn muốn chạy, cũng với startForeground()(cùng một ID thông báo)
  3. Dừng dịch vụ đầu tiên (giả mạo) (bạn có thể gọi stopSelf()và trong cuộc gọi onDestroy stopForeground(true)).

Voilà! Không có thông báo nào cả và dịch vụ thứ hai của bạn vẫn tiếp tục chạy.


23
Cám ơn vì cái này. Tôi nghĩ rằng một số người không nhận ra rằng có một sự phát triển Android đang được sử dụng cho mục đích kinh doanh nội bộ (nghĩa là nó không có ý định xuất hiện trên thị trường hoặc được bán cho Joe Blow). Đôi khi mọi người yêu cầu những điều như "ngừng hiển thị thông báo dịch vụ" và thật tốt khi xem các giải pháp thay thế ngay cả khi nó không phải là kosher dành cho tiêu dùng chung.
JamieB

5
@JamieB Tôi không thể đồng ý hơn ... Tôi đề nghị với Dianne Hackborn rằng họ cần phải suy nghĩ lại toàn bộ khái niệm về dịch vụ nền và có thể thêm quyền để chạy một dịch vụ trong nền mà không cần thông báo. Nó không quan trọng đối với chúng tôi, các nhà phát triển có thông báo hay không - đó là USER yêu cầu xóa nó! :) Nhân tiện, bạn có thể xác minh nó cũng hoạt động cho bạn?
Lior Iluz

1
@JamieB user875707 cho biết đặt tham số biểu tượng (id tài nguyên của biểu tượng) thành 0, không phải id thông báo (Nếu vậy, như tài liệu nói "startForeground" sẽ không hoạt động).
wangqi060934,

9
Tất nhiên, bạn nên giả định rằng điều này sẽ không hoạt động trong các phiên bản tương lai của nền tảng.
hackbod

1
@JamieB Tôi thực sự đã thử nghiệm điều này ngay bây giờ trên Android 5.0.1 và nó vẫn hoạt động với tôi.
Lior Iluz

20

Tính năng này không còn hoạt động với Android 7.1 và có thể vi phạm chính sách dành cho nhà phát triển của Google Play .

Thay vào đó, hãy yêu cầu người dùng chặn thông báo dịch vụ .


Đây là cách tôi thực hiện kỹ thuật trong câu trả lời của Lior Iluz .

ForegroundService.java

public class ForegroundService extends Service {

    static ForegroundService instance;

    @Override
    public void onCreate() {
        super.onCreate();

        instance = this;

        if (startService(new Intent(this, ForegroundEnablingService.class)) == null)
            throw new RuntimeException("Couldn't find " + ForegroundEnablingService.class.getSimpleName());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        instance = null;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

ForegroundEnablingService.java

public class ForegroundEnablingService extends Service {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        if (ForegroundService.instance == null)
            throw new RuntimeException(ForegroundService.class.getSimpleName() + " not running");

        //Set both services to foreground using the same notification id, resulting in just one notification
        startForeground(ForegroundService.instance);
        startForeground(this);

        //Cancel this service's notification, resulting in zero notifications
        stopForeground(true);

        //Stop this service so we don't waste RAM.
        //Must only be called *after* doing the work or the notification won't be hidden.
        stopSelf();

        return START_NOT_STICKY;
    }

    private static final int NOTIFICATION_ID = 10;

    private static void startForeground(Service service) {
        Notification notification = new Notification.Builder(service).getNotification();
        service.startForeground(NOTIFICATION_ID, notification);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

}

AndroidManifest.xml

<service android:name=".ForegroundEnablingService" />
<service android:name=".ForegroundService" />

Khả năng tương thích

Đã thử nghiệm và làm việc trên:

  • Trình giả lập chính thức
    • 4.0.2
    • 4.1.2
    • 4.2.2
    • 4.3.1
    • 4.4.2
    • 5.0.2
    • 5.1.1
    • 6.0
    • 7.0
  • Sony Xperia M
    • 4.1.2
    • 4.3
  • Samsung Galaxy?
    • 4.4.2
    • 5.X
  • Genymotion
    • 5.0
    • 6.0
  • CyanogenMod
    • 5.1.1

Không còn hoạt động với Android 7.1.


2
Chưa thử nghiệm nó, nhưng sẽ rất tốt nếu có ít nhất một sự cho phép cho điều đó !!! 1 cho phần "Để Google", người sử dụng tôi đang phàn nàn về thông báo cần thiết để giữ cho các ứng dụng đang chạy ở chế độ nền, tôi cũng khiếu nại về việc thông báo cần thiết cho skype / llama và bất kỳ ứng dụng khác ngoài kia
Rami Dabain

xin lỗi làm thế nào mà ví dụ này có thể được sử dụng để nghe báo động. Tôi đang phát triển một ứng dụng đặt báo thức với alertManager và vấn đề tôi gặp phải là khi tôi đóng ứng dụng (Ứng dụng gần đây-> Xóa), tất cả các báo thức cũng bị xóa và tôi đang tìm cách ngăn chặn điều này
Ares91

@ Ares91, hãy thử đặt một câu hỏi StackOverflow riêng cho điều đó và đảm bảo bao gồm nhiều thông tin nhất có thể, bao gồm cả mã liên quan. Tôi không biết nhiều về hệ thống báo động và câu hỏi này chỉ là về các dịch vụ.
Sam

@Sam mà dịch vụ nên được gọi là đầu tiên, ForegroundEnablingService hoặc Forground
Android Man

@AndroidManForegroundService
Sam

14

Bạn có thể sử dụng cái này (theo đề xuất của @Kristopher Micinski):

Notification note = new Notification( 0, null, System.currentTimeMillis() );
note.flags |= Notification.FLAG_NO_CLEAR;
startForeground( 42, note );

CẬP NHẬT:

Xin lưu ý rằng điều này không được phép nữa với các bản phát hành Android KitKat +. Và hãy nhớ rằng điều này ít nhiều vi phạm nguyên tắc thiết kế trong Android khiến người dùng có thể nhìn thấy các hoạt động nền như @Kristopher Micinski đã đề cập


2
Lưu ý rằng điều này dường như không được chấp nhận nữa với SDK 17. Dịch vụ sẽ không chuyển sang nền trước nếu có thể kéo được chuyển đến thông báo là 0
Snicolas

Đó là một lỗi và hy vọng đã được sửa. Ý tưởng của các dịch vụ nền trước là chúng ít bị khai tử hơn và đây là một cách để đảm bảo người dùng nhận thức được sự tồn tại của nó.
Martin Marconcini

4
Với Android 18 thông báo là không vô hình nữa nhưng chương trình nói "App đang chạy, Touch để biết thêm thông tin hoặc để ngăn chặn các ứng dụng"
Emanuel Moecklin

1
Ảnh chụp màn hình từ một trong những khách hàng của tôi: 1gravity.com/k10/Screenshot_2013-07-25-12-35-49.jpg . Tôi cũng có một thiết bị 4.3 và có thể xác nhận phát hiện đó.
Emanuel Moecklin

2
Cảnh báo: Tôi nhận được báo cáo sự cố từ Sony Ericsson LT26i (Xperia S) với Android 4.1.2 (SDK 16): android.app.RemoteServiceException: Thông báo lỗi được đăng từ gói ...: Không thể tạo biểu tượng: StatusBarIcon (pkg = ... id = 0x7f020052 level = 0 opens = true num = 0) Tôi cũng đã đặt id biểu tượng thành 0 cho đến SDK 17. Từ SDK 18, tôi đã đặt nó thành tài nguyên có thể vẽ hợp lệ. Có thể, bạn cần một id biểu tượng hợp lệ từ SDK 16!
almisoft

13

Cảnh báo : mặc dù câu trả lời này có vẻ hoạt động, nhưng trên thực tế, nó âm thầm ngăn không cho dịch vụ của bạn trở thành dịch vụ nền .

Câu trả lời ban đầu:


Chỉ cần đặt ID thông báo của bạn thành 0:

// field for notification ID
private static final int NOTIF_ID = 0;

    ...
    startForeground(NOTIF_ID, mBuilder.build());
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    mNotificationManager.cancel(NOTIF_ID);
    ...

Một lợi ích mà bạn có thể nhận được là, a Servicesẽ có thể chạy ở mức ưu tiên cao mà không bị phá hủy bởi hệ thống Android, trừ khi áp lực bộ nhớ cao.

BIÊN TẬP

Để làm cho nó hoạt động với Pre-Honeycomb và Android 4.4 trở lên, hãy đảm bảo rằng bạn sử dụng NotificationCompat.Builderđược cung cấp bởi Thư viện hỗ trợ v7, thay vì Notification.Builder.


1
Điều này hoạt động hoàn hảo đối với tôi trên 4.3 (18) @vlad sol. Tại sao tôi vẫn chưa có phiếu ủng hộ nào khác cho câu trả lời này?
Rob McFeely

Tôi đã thử điều này trong Android N Preview 4 và nó không hoạt động. Tôi đã thử Notification.Builder, Thư viện hỗ trợ v4 NotificationCompat.Buildervà Thư viện hỗ trợ v7 NotificationCompat.Builder. Thông báo không xuất hiện trong ngăn thông báo hoặc thanh trạng thái, nhưng dịch vụ không chạy ở chế độ nền khi tôi kiểm tra bằng cách sử dụng getRunningServices()dumpsys.
Sam

@Sam, Vì vậy, lỗi này không xuất hiện trên phiên bản trước đó, đúng không?
Anggrayudi H

@AnggrayudiH, bởi "lỗi này", ý bạn là thông báo không xuất hiện? Hay ý bạn là dịch vụ không chuyển sang chế độ nền trước?
Sam

1
Điều này không làm việc cho tôi. Quá trình được bắt đầu ở nền trước khi gửi id! = 0, nhưng KHÔNG được bắt đầu ở nền trước khi id = 0. Sử dụng adb shell dumpsys activity servicesđể xác minh.
Beetree

8

Bạn có thể ẩn thông báo trên Android 9+ bằng cách sử dụng bố cục tùy chỉnh với layout_height = "0dp"

NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationUtils.CHANNEL_ID);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.custom_notif);
builder.setContent(remoteViews);
builder.setPriority(NotificationCompat.PRIORITY_LOW);
builder.setVisibility(Notification.VISIBILITY_SECRET);

custom_notif.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="0dp">
</LinearLayout>

Đã thử nghiệm trên Pixel 1, android 9. Giải pháp này không hoạt động trên Android 8 trở xuống


Cách giải quyết tốt. Ngoài ra, tôi nghĩ rằng nó yêu cầu biểu tượng trên android 10. Sử dụng hình ảnh giữ chỗ trong suốt cho biểu tượng sẽ giải quyết được vấn đề.
shyos

7

Cập nhật: tính năng này không còn hoạt động trong Android 4.3 trở lên


Có một cách giải quyết. Hãy thử tạo thông báo mà không có biểu tượng cài đặt và thông báo sẽ không hiển thị. Không biết nó hoạt động như thế nào, nhưng nó có :)

    Notification notification = new NotificationCompat.Builder(this)
            .setContentTitle("Title")
            .setTicker("Title")
            .setContentText("App running")
            //.setSmallIcon(R.drawable.picture)
            .build();
    startForeground(101,  notification);

3
Trong Android N Preview 4, điều này không hoạt động. Android hiển thị (YourServiceName) is runningthông báo thay vì thông báo của riêng bạn khi bạn không chỉ định biểu tượng. Theo CommonsWare, điều này đã xảy ra kể từ Android 4.3: commonsware.com/blog/2013/07/30/…
Sam

1
Tôi đã thực hiện một số thử nghiệm hôm nay và xác nhận rằng điều này không hoạt động trong Android 4.3 trở lên.
Sam

5

Cập nhật: tính năng này không còn hoạt động trong Android 4.3 trở lên


Tôi đặt tham số biểu tượng cho phương thức khởi tạo cho Thông báo thành 0, sau đó chuyển thông báo kết quả đến startForeground (). Không có lỗi trong nhật ký và không có thông báo nào hiển thị. Tuy nhiên, tôi không biết liệu dịch vụ đã được tạo nền trước thành công hay chưa - có cách nào để kiểm tra không?

Đã chỉnh sửa: Đã kiểm tra với bãi chứa, và thực sự là dịch vụ được hiển thị trước trên hệ thống 2.3 của tôi. Chưa kiểm tra với các phiên bản hệ điều hành khác.


9
Sử dụng lệnh "adb shell kết xuất các dịch vụ hoạt động" để kiểm tra xem "isForeground" có được đặt thành true hay không.
đen

1
Hoặc chỉ gọi hàm tạo rỗng Notification().
johsin18

Điều này đã làm việc cho tôi. Lần đầu tiên tôi yêu cầu dịch vụ của mình chạy qua đêm nên nó chắc chắn ở phía trước (cộng với các bãi chứa cho biết là như vậy) và không có thông báo.
JamieB

Lưu ý rằng điều này không còn hoạt động trong Android 4.3 (API 18). Hệ điều hành đặt thông báo giữ chỗ vào ngăn thông báo.
Sam

4

Chặn thông báo dịch vụ nền trước

Hầu hết các câu trả lời ở đây hoặc không hoạt động, phá vỡ dịch vụ nền hoặc vi phạm chính sách của Google Play .

Cách duy nhất để ẩn thông báo một cách đáng tin cậy và an toàn là người dùng chặn nó.

Android 4.1 - 7.1

Cách duy nhất là chặn tất cả thông báo từ ứng dụng của bạn:

  1. Đưa người dùng đến màn hình chi tiết của ứng dụng:

    Uri uri = Uri.fromParts("package", getPackageName(), null);
    Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).setData(uri);
    startActivity(intent);
    
  2. Có thông báo của ứng dụng chặn người dùng

Lưu ý rằng điều này cũng chặn việc nâng cốc ứng dụng của bạn.

Android 8.0 - 8.1

Việc chặn thông báo trên Android O là không đáng vì hệ điều hành này sẽ chỉ thay thế nó bằng thông báo " chạy ẩn " hoặc " sử dụng pin ".

Android 9+

Sử dụng Kênh thông báo để chặn thông báo dịch vụ mà không ảnh hưởng đến các thông báo khác của bạn.

  1. Gán thông báo dịch vụ cho kênh thông báo
  2. Đưa người dùng đến cài đặt của kênh thông báo

    Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
        .putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName())
        .putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId());
    startActivity(intent);
    
  3. Có thông báo của kênh người dùng chặn


2

Phiên bản 4.3 (18) trở lên không thể ẩn thông báo dịch vụ, nhưng bạn có thể tắt biểu tượng, phiên bản 4.3 (18) trở xuống có thể ẩn thông báo

Notification noti = new Notification();
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
    noti.priority = Notification.PRIORITY_MIN;
}
startForeground(R.string.app_name, noti);

Mặc dù câu trả lời này có thể đúng và hữu ích, nhưng sẽ được ưu tiên hơn nếu bạn bao gồm một số lời giải thích cùng với nó để giải thích cách nó giúp giải quyết vấn đề. Điều này trở nên đặc biệt hữu ích trong tương lai, nếu có một thay đổi (có thể không liên quan) khiến nó ngừng hoạt động và người dùng cần hiểu nó đã hoạt động như thế nào.
Kevin Brown

Tôi nghĩ rằng Android 4.3 thực sự là API 18. Ngoài ra, phương pháp này chỉ ẩn biểu tượng khỏi thanh trạng thái; biểu tượng vẫn tồn tại trong thông báo.
Sam,

để ẩn biểu tượng khỏi thông báo, bạn có thể thêm hình ảnh trống mBuilder.setSmallIcon (R.drawable.blank);
vlad sol

1
Tôi đang xem nguồn kitkat và phương pháp zero ID dường như không hoạt động được. nếu ID bằng 0, bản ghi dịch vụ được cập nhật thành KHÔNG nền trước.
Jeffrey Blattman

2

Tôi thấy trên Android 8.0 vẫn có thể thực hiện được bằng cách không sử dụng kênh thông báo.

public class BootCompletedIntentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

                Intent notificationIntent = new Intent(context, BluetoothService.class);    
                context.startForegroundService(notificationIntent);

            } else {
                //...
            }

        }
    }
}

Và trong BluetoothService.class:

 @Override
    public void onCreate(){    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            Intent notificationIntent = new Intent(this, BluetoothService.class);

            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

            Notification notification = new Notification.Builder(this)
                    .setContentTitle("Title")
                    .setContentText("App is running")
                    .setSmallIcon(R.drawable.notif)
                    .setContentIntent(pendingIntent)
                    .setTicker("Title")
                    .setPriority(Notification.PRIORITY_DEFAULT)
                    .build();

            startForeground(15, notification);

        }

    }

Thông báo liên tục không được hiển thị, tuy nhiên bạn sẽ thấy thông báo Android 'x ứng dụng đang chạy trong nền'.


Trong Android 8.1: "Thông báo không hợp lệ cho startForeground: java.lang.RuntimeException: kênh không hợp lệ cho thông báo dịch vụ"
T-igra

Cá nhân tôi nghĩ rằng apps are running in the backgroundthông báo thậm chí còn tệ hơn một thông báo dành riêng cho ứng dụng, vì vậy tôi không chắc cách tiếp cận này có xứng đáng.
Sam

-2

Cập nhật: tính năng này không còn hoạt động trong Android 7.1 trở lên


Đây là một cách để đặt oom_adj của ứng dụng của bạn thành 1 (Đã thử nghiệm trong trình mô phỏng ANDROID 6.0 SDK).Thêm một dịch vụ tạm thời, Trong cuộc gọi dịch vụ chính của bạn startForgroundService(NOTIFICATION_ID, notificion). Và sau đó bắt đầu lại cuộc gọi dịch vụ tạm thời startForgroundService(NOTIFICATION_ID, notificion)với cùng một id thông báo, sau một thời gian trong lệnh gọi dịch vụ tạm thời stopForgroundService (true) để loại bỏ việc ghi chú.


Đây là giải pháp hiệu quả duy nhất mà tôi biết. Tuy nhiên, nó đã được bao phủ bởi một câu trả lời khác .
Sam

-3

Bạn cũng có thể tuyên bố ứng dụng của mình là bền bỉ.

<application
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/Theme"
    *android:persistent="true"* >
</application>

Điều này về cơ bản đặt ứng dụng của bạn ở mức ưu tiên bộ nhớ cao hơn, giảm khả năng ứng dụng bị giết.


5
Điều này là sai, chỉ các ứng dụng hệ thống mới có thể hoạt động ổn định: groups.google.com/forum/?fromgroups=#!topic/android-developers/…
Snicolas

-6

Tôi đã phát triển một trình phát đa phương tiện đơn giản vài tháng trước. Vì vậy, điều tôi tin là nếu bạn đang làm điều gì đó như:

Intent i = new Intent(this, someServiceclass.class);

startService (i);

Sau đó, hệ thống sẽ không thể giết dịch vụ của bạn.

tham khảo : đọc đoạn thảo luận khi hệ thống dừng dịch vụ


Tôi đọc trong một số bài báo. Nếu chỉ làm startService () thì hệ thống cần thêm bộ nhớ. Vì vậy, hệ thống sẽ giết dịch vụ đó. điều đó đúng? Tôi chỉ không có thời gian để làm thử nghiệm trong dịch vụ.
Muhammad Resna Rizki Pratama

1
Muhammad, điều đó đúng - mục đích của startForeground () là cung cấp hiệu quả cho dịch vụ có "mức độ ưu tiên bộ nhớ" cao hơn các dịch vụ nền để nó có thể tồn tại lâu hơn. StartForeground () nên sử dụng thông báo để người dùng biết rõ hơn về một dịch vụ dai dẳng / khó diệt hơn đang chạy.
DustinB

Đơn giản là nó sai; thực tế là không thể tạo ra một dịch vụ không thể bị giết trên Android. Android dễ dàng tiêu diệt các dịch vụ không có nền trước để giải phóng bộ nhớ.
Sam
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.