startForeground 无法显示我的通知
startForeground fails to show my notification
startForeground()
无法显示下面的通知,这是为了让监视接近传感器变化的服务保持活动状态。 logcat.
没有错误
这是我启动服务的地方
Intent intent = new Intent(ctx, ProximityService.class);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
ctx.startForegroundService(intent);
} else {
ctx.startService(intent);
}
邻近服务class
public class ProximityService extends IntentService implements SensorEventListener {
@RequiresApi(api = Build.VERSION_CODES.O)
private void startMyOwnForeground(){
String NOTIFICATION_CHANNEL_ID = "com.example.xxxxxx";
String channelName = "Background Proximity Service";
NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_HIGH);
chan.setLightColor(Color.BLUE);
chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
manager.createNotificationChannel(chan);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
Notification notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("App is running in background")
.setPriority(NotificationManager.IMPORTANCE_HIGH)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
startForeground(1, notification);
}
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
startMyOwnForeground();
else
startForeground(1, new Notification());
}
@Override
public int onStartCommand(Intent aIntent, int aFlags, int aStartId){
super.onStartCommand(aIntent, aFlags, aStartId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
startMyOwnForeground();
else
startForeground(1, new Notification());
return START_STICKY;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
if (event.values[0] < event.sensor.getMaximumRange()) {
// near
Toast.makeText(getApplicationContext(), "near", Toast.LENGTH_SHORT).show();
} else {
// far
Toast.makeText(getApplicationContext(), "far", Toast.LENGTH_SHORT).show();
}
}
}
public ProximityService() {
super("Proximity Service");
}
protected void onHandleIntent(Intent workIntent) {
SensorManager m_sensor_manager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor m_prox = m_sensor_manager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
m_sensor_manager.registerListener(this, m_prox, SensorManager.SENSOR_DELAY_NORMAL);
}
AndroidManifest.xml
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<service android:enabled="true" android:name=".ProximityService"/>
build.gradle
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.example.xxxxxx"
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"
问题是自定义的前台服务是从IntentService
instead of the Service
class; and when the onHandleIntent()
get completed, the IntentService
will automatically stop, and therefore no notification comes up. Check here扩展而来的,以便完全理解。
因此,您需要从 Service
class 扩展,并相应地覆盖 onBind()
。因此,将其附加到您的 class:
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
另请注意,从 API 级别 30 开始,IntentService
已弃用,取而代之的是 WorkManager
或 JobIntentService
startForeground()
无法显示下面的通知,这是为了让监视接近传感器变化的服务保持活动状态。 logcat.
这是我启动服务的地方
Intent intent = new Intent(ctx, ProximityService.class);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
ctx.startForegroundService(intent);
} else {
ctx.startService(intent);
}
邻近服务class
public class ProximityService extends IntentService implements SensorEventListener {
@RequiresApi(api = Build.VERSION_CODES.O)
private void startMyOwnForeground(){
String NOTIFICATION_CHANNEL_ID = "com.example.xxxxxx";
String channelName = "Background Proximity Service";
NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_HIGH);
chan.setLightColor(Color.BLUE);
chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
assert manager != null;
manager.createNotificationChannel(chan);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
Notification notification = notificationBuilder.setOngoing(true)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentTitle("App is running in background")
.setPriority(NotificationManager.IMPORTANCE_HIGH)
.setCategory(Notification.CATEGORY_SERVICE)
.build();
startForeground(1, notification);
}
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
startMyOwnForeground();
else
startForeground(1, new Notification());
}
@Override
public int onStartCommand(Intent aIntent, int aFlags, int aStartId){
super.onStartCommand(aIntent, aFlags, aStartId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
startMyOwnForeground();
else
startForeground(1, new Notification());
return START_STICKY;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) {
if (event.values[0] < event.sensor.getMaximumRange()) {
// near
Toast.makeText(getApplicationContext(), "near", Toast.LENGTH_SHORT).show();
} else {
// far
Toast.makeText(getApplicationContext(), "far", Toast.LENGTH_SHORT).show();
}
}
}
public ProximityService() {
super("Proximity Service");
}
protected void onHandleIntent(Intent workIntent) {
SensorManager m_sensor_manager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor m_prox = m_sensor_manager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
m_sensor_manager.registerListener(this, m_prox, SensorManager.SENSOR_DELAY_NORMAL);
}
AndroidManifest.xml
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<service android:enabled="true" android:name=".ProximityService"/>
build.gradle
android {
compileSdkVersion 29
buildToolsVersion "29.0.3"
defaultConfig {
applicationId "com.example.xxxxxx"
minSdkVersion 16
targetSdkVersion 29
versionCode 1
versionName "1.0"
问题是自定义的前台服务是从IntentService
instead of the Service
class; and when the onHandleIntent()
get completed, the IntentService
will automatically stop, and therefore no notification comes up. Check here扩展而来的,以便完全理解。
因此,您需要从 Service
class 扩展,并相应地覆盖 onBind()
。因此,将其附加到您的 class:
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
另请注意,从 API 级别 30 开始,IntentService
已弃用,取而代之的是 WorkManager
或 JobIntentService