在 MIUI 10 (测试设备: Redmi note 5 pro )中运行前台服务时,我一直在搞乱android服务并遇到问题。
只要用户与活动进行交互,基本服务就会运行,但是一旦用户终止活动,前台服务也会被终止。
我阅读了有关相同问题的其他答案,
指出在Xaomi,Oppo,联想,LG,荣耀等设备中 您需要为该应用启用“自动运行”权限
我尝试失败了。我也尝试了以下方法,但都没有成功:
对我有用的是启用开发人员选项中的“不要保持活动状态” ,但是在实际应用中,您可能不会要求用户启用此选项会影响用户体验。
顺便说一句,我在其他设备(例如,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
答案 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>
希望它对您有用。