Android Service startForeground不显示Notification的办法

Android 有Service后台执行重要任务时,提升后台优先级可使用startForeground方法,将使Service处于Perceptible优先级,adj=2,这一优先级比Service/BService都要高,可以一定程度上避免进程被LMK杀掉。
startForeground方法如下:

public final void startForeground(int id, Notification notification) {
        try {
            mActivityManager.setServiceForeground(
                    new ComponentName(this, mClassName), mToken, id,
                    notification, true);
        } catch (RemoteException ex) {
        }
    }

为了避免这方法在用户不知情的情况下被滥用,Android要求在使用startForeground时必须传入一个id,一个Notification,以在通知栏中显示明显通知。
重要事务干完后退出这一状态可使用方法stopForeground,如下:

    public final void stopForeground(boolean removeNotification) {
        try {
            mActivityManager.setServiceForeground(
                    new ComponentName(this, mClassName), mToken, 0, null,
                    removeNotification);
        } catch (RemoteException ex) {
        }
    }

可以选择关闭Notification。

在需要Service处于较高优先级而又不希望显示通知时,可以使用特殊技巧。如我们需要某一 ServiceX后台运行并且不能被杀掉,同时不希望被用户察觉,可以这样:
1,启动ServiceX并startForeground(id, notification)
2,立刻启动另一个ServiceY,也startForeground(id, notification),这里的id与ServiceX中startForeground的id一致;然后关闭在ServiceY中stopForeground(true)。
3,OK!

程序运行时,返回桌面,使用命令 adb shell dumpsys meminfo
进程不在 Service或BService中,而是在Perceptible中,而且没有显示通知。

根据提供的引用内容,当使用`Context.startForegroundService()`启动服务后,必须在服务的`onCreate()`方法中调用`Service.startForeground()`方法,否则会报错`android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()`。这是因为在Android O(API级别26)及更高版本中,启动前台服务需要调用`startForeground()`方法来显示通知,以确保服务在后台运行时不会被系统杀死。 以下是一个示例代码,演示如何正确使用`Service.startForeground()`方法: ```java public class MyService extends Service { private static final int NOTIFICATION_ID = 1; @Override public void onCreate() { super.onCreate(); // 创建通知 Notification notification = new Notification.Builder(this) .setContentTitle("Foreground Service") .setContentText("Service is running in the foreground") .setSmallIcon(R.drawable.ic_notification) .build(); // 将服务设置为前台服务 startForeground(NOTIFICATION_ID, notification); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // 执行服务的逻辑操作 return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); // 停止前台服务 stopForeground(true); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } ``` 在上述示例中,我们在服务的`onCreate()`方法中创建了一个通知,并调用`startForeground()`方法将服务设置为前台服务。在服务的`onDestroy()`方法中,我们调用`stopForeground(true)`方法停止前台服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值