APP常驻通知栏保活

android常驻通知栏能保活吗?比如我在service里面写了socket-tcp连接,想要一直保持这个连接不中断,中断自动连接,但是怕在息屏或使用其他app的时候系统关闭程序,这时用常驻通知栏能保证app不被关闭,并保持socket连接吗?

这是我服务里面写的

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

xml的也加了,现在报 Bad notification for startForeground

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        /*拿到传递过来的ip和端口号*/
        ip = intent.getStringExtra("IP");
        port =intent.getIntExtra("PORT",0) ;

        Notification notification = new NotificationCompat.Builder(this, "1")
                .setContentTitle("My App")
                .setContentText("Running...")
                .setSmallIcon(R.drawable.ic_launcher_background)
                .setPriority(NotificationCompat.PRIORITY_LOW)
                .build();
        startForeground(NOTIFICATION_ID, notification);

        /*初始化socket*/
        initSocket();

       flags = Service.START_FLAG_REDELIVERY;
        return super.onStartCommand(intent, flags, startId);
    }

在 Android 中,常驻通知栏可以帮助应用程序保持运行,但并不能完全保证应用程序不被系统关闭。即使应用程序运行在前台,如果系统资源不足,系统也可能会关闭应用程序,这通常发生在用户长时间不使用应用程序时。
不过,使用常驻通知栏确实可以增加应用程序被系统关闭的概率。因为在 Android 中,常驻通知栏会被认为是一个重要通知,系统会尽可能让这个应用程序保持运行。此外,常驻通知栏还可以让用户随时知道应用程序正在后台运行,从而增加用户对应用程序的信任感和满意度。
在您的情况下,如果您想要保持 Socket TCP 连接不中断,可以将 Socket 连接的代码放在 Service 中,并使用常驻通知栏来保持 Service 运行。但是,您还需要考虑一些问题,如电池寿命和用户体验等。如果您的应用程序需要长时间运行,可能会消耗大量的电池和系统资源,这可能会影响用户体验。所以,建议您在实现时要进行一些优化和限制,以确保应用程序的可靠性和用户体验。

Android的常驻通知栏可以帮助保活应用,但是它不能保证应用中的socket连接不中断。因为Android系统有一些内存优化机制,可能会关闭socket连接,以节省内存空间。为了保持socket连接不中断,可以在service中使用AlarmManager来定期发送心跳包,以确保socket连接持续不断。

通过在Android应用程序中添加一个常驻通知,可以使应用程序保持运行并防止系统将其关闭,从而保证Socket连接不中断。

当应用程序进入后台时,Android系统会对其进行内存管理,从而释放一些资源。但如果应用程序在通知栏中添加了一个常驻通知,系统将把该应用程序视为正在运行的应用程序,并且不会对其进行内存管理。这样可以确保应用程序的Service能够继续运行,从而保持Socket连接。

为了实现这一点,需要在应用程序中创建一个前台服务,并在该服务中创建一个常驻通知。下面是一个示例代码:


public class MyService extends Service {

    private static final int NOTIFICATION_ID = 1;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 创建一个常驻通知
        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
                .setContentTitle("My App")
                .setContentText("Running...")
                .setSmallIcon(R.drawable.ic_notification)
                .setPriority(NotificationCompat.PRIORITY_LOW)
                .build();

        // 将服务设置为前台服务,并显示通知
        startForeground(NOTIFICATION_ID, notification);

        // 开始执行您的Socket连接操作
        // ...

        return START_STICKY;
    }

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

在 Android 中,可以通过实现一个前台服务(Foreground Service)来让应用在后台保持运行状态,而常驻通知栏就是其中的一种实现方式。

具体来说,通过在 Service 中创建一个 Notification 并调用 startForeground() 方法将 Service 放入前台,这样就可以保证应用在后台时不被系统杀死,同时在通知栏中显示一个通知,告知用户当前应用正在运行。

下面是一个简单的示例代码:

public class MyService extends Service {

    private static final int NOTIFICATION_ID = 1;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        // 创建通知
        Notification notification = new Notification.Builder(this, CHANNEL_ID)
                .setContentTitle("My App")
                .setContentText("Running in the background")
                .setSmallIcon(R.drawable.ic_notification)
                .build();

        // 将 Service 放入前台
        startForeground(NOTIFICATION_ID, notification);

        // TODO: 在这里执行需要常驻运行的任务,比如 socket-tcp 连接

        return START_STICKY;
    }

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

        // 停止前台运行,移除通知
        stopForeground(true);

        // TODO: 在这里执行释放资源的任务
    }
}


需要注意的是,前台服务会在通知栏中显示一个持久的通知,因此需要为该通知设置一个合适的图标和内容,以便用户能够识别应用在后台运行的状态。同时,需要注意释放资源和停止服务的时机,以避免内存泄漏和消耗过多的系统资源。

回答不易,还请能够采纳!!!

常驻通知栏可以帮助你的应用在后台运行,以避免被系统关闭,但是并不能保证socket连接的持久性,因为即使应用程序保持运行,它仍然可能失去网络连接。

如果你想要在连接中断后自动重新连接,你可以在你的服务中添加一个重连的逻辑。你可以在连接中断时调用initSocket(),以重新建立连接。同时,你也可以在onStartCommand()中返回START_STICKY,这样当服务被系统关闭后,它会尝试重新启动服务。

另外,如果你的应用程序需要在后台长时间运行,并且需要维护一些长时间运行的任务,你可能需要考虑使用JobScheduler或WorkManager等系统提供的任务调度器。这些调度器可以在应用程序的运行时间受到限制时,仍然可以维护应用程序的后台任务。

最后,为了确保你的应用程序在后台运行时不会被系统杀死,你需要遵循Android的一些最佳实践。例如,避免在后台运行过多的进程、服务和线程,尽可能减少内存使用,以及使用系统提供的任务调度器来管理长时间运行的任务。

不能,常驻通知栏只能保持程序的前台运行,不能保证程序不被关闭,也不能保持socket连接。