如何使前台服务在MIUI中工作?

时间:2019-01-02 15:57:10

标签: java android dalvik

MIUI 10 (测试设备: Redmi note 5 pro )中运行前台服务时,我一直在搞乱android服务并遇到问题。

只要用户与活动进行交互,基本服务就会运行,但是一旦用户终止活动,前台服务也会被终止。

我阅读了有关相同问题的其他答案,

  

指出在Xaomi,Oppo,联想,LG,荣耀等设备中   您需要为该应用启用“自动运行”权限

我尝试失败了。我也尝试了以下方法,但都没有成功:

  1. 禁用MIUI优化
  2. 禁用省电
  3. 取消了该应用的电池电量限制
  4. 释放了内存(总计:3GB,可用: 2GB)

对我有用的是启用开发人员选项中的“不要保持活动状态” ,但是在实际应用中,您可能不会要求用户启用此选项会影响用户体验。

Developer options MIUI 10

顺便说一句,我在其他设备(例如,pixel,nexus等)(Android Studio模拟器)上测试了我的应用程序,并且它们都运行良好。造成此问题的只是我的设备。

用于调试的应用程序下载链接:https://anonfile.com/d4k511p1bd/app-debug_apk

源代码

文件:MainActivity.java

package com.myname.foregroundserviceexample;

import android.content.Intent;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
    private EditText editTextInput;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextInput = findViewById(R.id.edit_text_input);
    }

    public void startService(View v) {
        String input = editTextInput.getText().toString();

        Intent serviceIntent = new Intent(this, ExampleService.class);
        serviceIntent.putExtra("inputExtra", input);

        ContextCompat.startForegroundService(this, serviceIntent);
    }

    public void stopService(View v) {
        Intent serviceIntent = new Intent(this, ExampleService.class);
        stopService(serviceIntent);
    }

}

文件:ExampleService.java

package com.myname.foregroundserviceexample;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;

import static com.myname.foregroundserviceexample.App.CHANNEL_ID;


public class ExampleService extends Service {

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String input = intent.getStringExtra("inputExtra");

        Intent notificationIntent = new Intent(this, MainActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this,
                0, notificationIntent, 0);

        Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("Example Service")
            .setContentText(input)
            .setSmallIcon(R.drawable.ic_android)
            .setContentIntent(pendingIntent)
            .build();
        // Starting Foreground Service
        startForeground(1, notification);

        return START_NOT_STICKY;
    }

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

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

文件:App.java

package com.myname.foregroundserviceexample;

import android.app.Application;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.Build;


public class App extends Application {
    public static final String CHANNEL_ID = "exampleServiceChannel";

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

        createNotificationChannel();
    }

    private void createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel serviceChannel = new NotificationChannel(
                CHANNEL_ID,
                "Example Service Channel",
                NotificationManager.IMPORTANCE_DEFAULT
            );

            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(serviceChannel);
        }
    }
}

我知道可以通过在“开发”选项中启用“不保留活动”来解决此问题,但我确实不希望用户在其设备中启用此功能,我也很乐意接受任何替代或代码方面的改进MIUI 10中的前台服务工作。

谢谢

编辑:

这是项目链接:https://anonfile.com/y5Rd4bp3b9/ForegroundServiceExample_zip

这是我在YouTube上关注的教程:https://www.youtube.com/watch?v=FbpD5RZtbCc

2 个答案:

答案 0 :(得分:0)

也许您应该尝试在创建onCreate / onStartIntent的服务开始时致电Service#startForeground

有关更多信息,请参见此帖子Context.startForegroundService() did not then call Service.startForeground()

答案 1 :(得分:0)

如果您遇到这样的错误。

Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE

然后,您必须将其添加到清单文件中。

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

希望它对您有用。