- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有点困惑,因为我读了一些帖子,如果 API >= 26,我也应该使用 ContextCompat.StartForegroundService();
。
现在我仍然只使用 StartService 并且它可以工作,即使我应该在 API >= 26 上得到 IllegalStateException
(手机上当前的 api 是 27)根据这篇文章。
https://medium.com/mindorks/mastering-android-service-of-2018-a4a1df5ed5a6
I know Service is an old concept. Let me assure you we will not discuss the basics and we will learn the recent changes made to the service layer in Android 8.0+, we will solve the mystery of famous IllegalStateException and RemoteServiceException. This article is not a conventional way of understanding services, hang tight till you can.
所以我的问题是我是否应该更改 startForeGroundService
还是只保留 API >=26 的 startService
?
处理我的服务连接的类:
/**This establishes the connection to the MediaPlayerService. */
public static ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MediaPlayerService.MusicBinder binder = (MediaPlayerService.MusicBinder)service;
mediaPlayerService = binder.getService();
mediaPlayerService.musicBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mediaPlayerService.musicBound = false;
}
};
/**This is called to start the MediaPlayerService. */
private static Intent mediaPlayerServiceIntent = null;
public static void startMusicService(Context c) {
/*mediaPlayerServiceIntent binds our connection to the MediaPlayerService. */
mediaPlayerServiceIntent = new Intent(c, MediaPlayerService.class);
c.bindService(mediaPlayerServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
c.startService(mediaPlayerServiceIntent);
mServiceIsActive = true;
}
/**This is called to stop the MediaPlayerService. (onDestroy) */
public static void stopMusicService(Context c) {
if (mediaPlayerServiceIntent == null)
return;
c.unbindService(serviceConnection);
c.stopService(mediaPlayerServiceIntent);
mediaPlayerServiceIntent = null;
mediaPlayerService = null;
}
主要 Activity :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Main.startMusicService(getApplicationContext());
}
最佳答案
startService 不适用于 api >=26
您可以借助以下代码将您的服务更改为前台服务。它将显示通知。
private void runAsForeground(){
Intent notificationIntent = new Intent(this, MediaPlayerService.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this, 0,
notificationIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification=new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentText(getString(R.string.isRecording))
.setContentIntent(pendingIntent).build();
startForeground(NOTIFICATION_ID, notification);
}
更多引用 - https://android-developers.googleblog.com/2018/12/effective-foreground-services-on-android_11.html
https://developer.android.com/guide/components/services
另一种方式(不推荐。目标 SDK 必须为 26 或更少)
public static void startService(Context context, Class className) {
try {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
Intent restartServiceIntent = new Intent(context, className);
restartServiceIntent.setPackage(context.getPackageName());
PendingIntent restartServicePendingIntent = PendingIntent.getService(context, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmService = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (alarmService != null) {
alarmService.set(
AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 500,
restartServicePendingIntent);
}
} else {
Intent i = new Intent(context, className);
context.startService(i);
}
} catch (Exception e) {
MyLog.e(TAG, "startService: ", e);
}
}
调用方式
startService(context,MediaPlayerService.class);
关于java - 对于 API >= 26,我应该使用 StartService 还是 StartForegroundService 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56471033/
正如问题标题所问,我想知道它们之间的区别是什么,因为文档不是很清楚它们是否真的存在差异。 提前致谢。 最佳答案 ContextCompat 是用于兼容性目的的实用程序类。 context.startF
将我的应用程序更新为目标 API 27(之前为 25)后,我遇到了许多来自用户的 ANR,但我无法重现。它们似乎与 Oreo 后台执行限制有关,并带有 ANR 消息 Context.startFore
我的 Android 服务中的 Context.startForegroundService() 没有调用 Service.startForeground(),但我不明白为什么会这样。 我的应用是做流
如果我多次调用 context.startForegroundService(startServiceIntent),我会多次调用带有新服务 Intent 的 onCreate() 还是我会第一次调用
我对三星设备上的服务后台工作有疑问。 Fatal Exception: android.app.RemoteServiceException: Context.startForegroundServi
如果设备操作系统是 Android 9(Pie),我已调用 Context.startForgroundService() 但有时它会抛出错误,例如“Context.startForgroundSer
我的应用程序将在 MainActivity 的 onCreate 中调用 startForegroundService(intent)。我将 startForeground(ON_SERVICE_CO
我从 Device Monitor 得到以下异常输出: //FATAL EXCEPTION: main //Process: com.xxx.yyy, PID: 11584 //android.app
这是我的 BroadcastReciever 类。处理启动手机状态的类(class)。 代码; public class BroadCastRecieverBoot extends Broadcast
我在 Android O 操作系统上使用 Service 类。 我打算在后台使用Service。 Android documentation声明 If your app targets API lev
在检查了 google 问题和 SO 上的许多其他问题后,我找到了在底部添加的解决方案。 我负责的事情如下: 在 onCreate 和 onStartCommand 中,我确保将服务移至前台(如果它尚
我不断在标题中收到错误,我不知道该怎么办..(这是一个水提醒应用程序。)论坛中有很多荒谬的主题。没有人正确回答。我用它在设备重新启动时运行。我研究了很多问题,但没有人正确回答。 请帮助我。提前致谢!
所以我的应用程序有一些触发服务和通知的远程操作。在调用 startForegroundService 和服务尝试启动通知之间,事情可能会发生变化,因此服务会再次检查事情的状态,然后决定要做什么。 因此
我在 Android 8.0 和 Android 7.x 中都通过 Fabric.io 收到了这个错误报告。 由于不仅仅是特定类失败,我不知道如何处理它们。 如果你有任何想法,请帮助我。 最佳答案 在
注意:这个问题假设您知道将服务绑定(bind)到上下文。 制作中的每个人都知道这个问题,甚至一些拥有 Android Oreo 或 Pie 设备的用户都知道。异常如下所示: Fatal Excepti
我目前正在研究如何创建一个 float 的前台泡泡聊天头服务。 但是,我注意到我尝试使用的所有库都不适用于 API-28。 我相信这是由于提到的新限制 here in the Android docs
我正在使用的应用程序(在 Android O 中)将在设备重启后启动服务。设备重启后,在广播接收器的 onReceive() 方法中,它会调用服务作为 Android OS 8 及更高版本的 star
我注意到 Pixel 5 和 Pixel 4a(都在 Android 12 上)的一个异常(exception)(Firebase Crashlytics),没有其他设备,只发生了两次,每个设备一次。
我有点困惑,因为我读了一些帖子,如果 API >= 26,我也应该使用 ContextCompat.StartForegroundService();。 现在我仍然只使用 StartService 并
首先,我看了这些; Context.startForegroundService() did not then callService.startForeground() Context.startF
我是一名优秀的程序员,十分优秀!