当前位置: 首页 > 知识库问答 >
问题:

当点击电源按钮时,进程被Android操作系统终止

严宏旷
2023-03-14

Env:-Android6.0,华为智能手机

我的应用程序是一个IM客户端,它必须与服务器保持连接并从服务器接收消息。因此,只要网络连接可用,我就必须让它一直处于活动状态。

我使用前台服务使我的应用程序在后台保持活动状态。请参阅:android-keeping-a-background-service-alive-prevention-process-death此方法在android 4.1和4.4上运行良好。但它在Android5.1和6.0上失败了。单击电源按钮约10秒后,应用程序进程被终止。

以下是重新制作的步骤。这是一个简单的演示应用程序,它启动一个线程来跟踪进程是终止的还是活动的。

>

  • 使用活动启动android应用程序
  • 启动日志线程,每秒记录一条消息
  • 重写服务onStartCommand()方法,调用startForeground()并显示通知;

    点击按钮启动服务;

    等待约10秒,日志记录线程停止;

    单击应用程序图标再次启动应用程序;

    注意:我注意到一件奇怪的事情:当应用程序再次启动时,不会调用活动的onCreate()!

    任何帮助都很感激!提前感谢!

    以下是启动服务的代码:

        @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        AppGlobal.logDebug(">>>> onStartCommand()");
        if (intent.getAction().equals(Constants.ACTION.STARTFOREGROUND_ACTION)) {
            Log.i(LOG_TAG, "==== Received Start Foreground Intent ");
            showNotification();
            Toast.makeText(this, "Service Started!", Toast.LENGTH_SHORT).show();
    
        } else if (intent.getAction().equals(Constants.ACTION.PREV_ACTION)) {
            Log.i(LOG_TAG, "Clicked Previous");
    
            Toast.makeText(this, "Clicked Previous!", Toast.LENGTH_SHORT)
                    .show();
        } else if (intent.getAction().equals(Constants.ACTION.PLAY_ACTION)) {
            Log.i(LOG_TAG, "Clicked Play");
    
            Toast.makeText(this, "Clicked Play!", Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(Constants.ACTION.NEXT_ACTION)) {
            Log.i(LOG_TAG, "Clicked Next");
    
            Toast.makeText(this, "Clicked Next!", Toast.LENGTH_SHORT).show();
        } else if (intent.getAction().equals(
                Constants.ACTION.STOPFOREGROUND_ACTION)) {
            Log.i(LOG_TAG, "==== Received Stop Foreground Intent");
            stopForeground(true);
            stopSelf();
        }
        return START_STICKY;
    }
    
    
    private void showNotification() {
        AppGlobal.logDebug(">>>> show notification");
        Intent notificationIntent = new Intent(this, StTest33MainActivity.class);
        notificationIntent.setAction(Constants.ACTION.MAIN_ACTION);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);
    
        Intent previousIntent = new Intent(this, ForegroundService.class);
        previousIntent.setAction(Constants.ACTION.PREV_ACTION);
        PendingIntent ppreviousIntent = PendingIntent.getService(this, 0,
                previousIntent, 0);
    
        Intent playIntent = new Intent(this, ForegroundService.class);
        playIntent.setAction(Constants.ACTION.PLAY_ACTION);
        PendingIntent pplayIntent = PendingIntent.getService(this, 0,
                playIntent, 0);
    
        Intent nextIntent = new Intent(this, ForegroundService.class);
        nextIntent.setAction(Constants.ACTION.NEXT_ACTION);
        PendingIntent pnextIntent = PendingIntent.getService(this, 0,
                nextIntent, 0);
    
        Bitmap icon = BitmapFactory.decodeResource(getResources(),
                R.drawable.ic_launcher);
    
        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("TutorialsFace Music Player")
                .setTicker("TutorialsFace Music Player")
                .setContentText("My song")
                .setSmallIcon(R.drawable.ic_launcher)
                .setLargeIcon(Bitmap.createScaledBitmap(icon, 128, 128, false))
                .setContentIntent(pendingIntent)
                .setOngoing(true)
                .addAction(android.R.drawable.ic_media_previous, "Previous",
                        ppreviousIntent)
                .addAction(android.R.drawable.ic_media_play, "Play",
                        pplayIntent)
                .addAction(android.R.drawable.ic_media_next, "Next",
                        pnextIntent).build();
        startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
                notification);
    
    }
    
  • 共有1个答案

    商宝
    2023-03-14

    如果进程处于睡眠模式时未被列为受保护的应用程序,华为将停止该进程。转到“设置”-

     类似资料:
    • 问题内容: 我想测试在32位操作系统上是否可以通过乘法进程使用超过4GB的内存(我的:具有1GB内存的Ubuntu)。 因此,我编写了一个小程序,该程序的malloc小于1GB,并对该数组进行了一些操作,并运行了该程序的5个实例。 事实是,我怀疑OS杀死了其中的4个,只有一个幸存下来并显示为“ PID:我完成了”。 (我已经尝试过使用小型阵列并进行5次打印,而且当我使用TOP查看正在运行的进程时,

    • 好的,我有一个包含PDF文件数组的解析数据库,这些文件显示在我的表视图中。当用户选择一个文件时,他会被带到所选PDF的详细视图,并给出一个“下载”选项按钮。我使用相同的数组在表视图的segue上携带信息。下面是代码的样子。 我想编程这个按钮,以启动下载到个人设备,如果任何人可以帮助我。

    • 我试图自动发送短信到某一个号码时,用户按下屏幕上的一个按钮。

    • 每次我点击按钮1,我的应用程序就会崩溃。同一活动中的另一个按钮可以正常工作。我已经试过更换按钮和代码了。控制台中没有错误。

    • 我是新的Android和试图研发应用程序快速帮助。一旦用户双击电源按钮,我希望我的应用程序为两种情况直接呼叫救护车(屏幕打开/关闭)。我已经写了这段代码,但它不起作用。任何帮助将不胜感激。提前谢谢你。:) Android显示 我的电话服务。JAVA MyReceiver.java 主要活动。JAVA