这是onStartCommand()
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Notification creation code
telMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telMgr.listen(new PSL(), PhoneStateListener.LISTEN_CALL_STATE);
return super.onStartCommand(intent, flags, startId);
}
和PhoneStateListener类(在服务类下)
public class PSL extends PhoneStateListener {
public void onCallStateChanged(int state, String incomingNum) {
switch(state) {
case TelephonyManager.CALL_STATE_IDLE:
case TelephonyManager.CALL_STATE_OFFHOOK:
//Work1
break;
case TelephonyManager.CALL_STATE_RINGING:
//Work2
break;
}
}
}
它们都在同一个.java文件中
我在一个服务类上有这些代码。
当我从主要活动中调用startService()
时,效果很好。
但当我的应用程序被任务管理器,杀手或设备上的内存不足自动杀死时,服务确实重新启动但无法正常工作。
当我进入设置 - 应用程序 - 运行时,它显示进程1和服务1,在被杀死之前/之后。但是在被杀之后,内存共享变为1/10。我已经尝试使用我的通知轻松杀死startForeground() - 它没有用。 (不显示任何通知)
并尝试返回onStartCommand()
:START_STICKY
,START_REDELIVER_INTENT
- 显示相同的结果是否有任何方法可以完全重启或使其不被杀死?
答案 0 :(得分:1)
花费几个小时之后,我知道,对于Android 2.0或更高版本,您可以使用startForeground()方法在前台启动服务。 Documentation provided by Android
已启动的服务可以使用startForeground(int,Notification)API将服务置于前台状态,系统认为该服务是用户主动了解的内容,因此在内存不足时不会成为查杀的候选者。 (从理论上讲,服务在当前前台应用程序的极端内存压力下被杀死仍然是可能的,但实际上这不应该是一个问题。) Ther是前台服务很难被OS杀死的机会。但它运行正常。
public class ServicePhoneState extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Music Player")
.setTicker("Google Music Player")
.setContentText("My Music")
.setSmallIcon(R.drawable.ic_bg_icon)
.setPriority(Notification.PRIORITY_MAX)
.setContentIntent(pendingIntent)
.setOngoing(false)
.build();
startForeground(10, notification);
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
stopForeground(true);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
答案 1 :(得分:0)
我通过startForeground()
解决了这个问题它没有用,因为我没有在通知
上使用Notification.FLAG_FOREGROUND_SERVICE
答案 2 :(得分:0)
花费几个小时之后,我知道,对于Android 2.0或更高版本,您可以使用startForeground()方法在前台启动服务。 Documentation provided by Android
已启动的服务可以使用startForeground(int,Notification)API将服务置于前台状态,系统认为该服务是用户主动了解的内容,因此在内存不足时不会成为查杀的候选者。 (理论上,在当前前台应用程序的极端内存压力下,服务仍然可能会被杀死,但实际上这不应该是一个问题。)这是前台服务很难被OS杀死的机会。但它工作正常
public class ServicePhoneState extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
MyPhoneStateListener phoneListener = new
MyPhoneStateListener(ServicePhoneState.this);
TelephonyManager telephony = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("Music Player")
.setTicker("Google Music Player")
.setContentText("My Music")
.setSmallIcon(R.drawable.ic_bg_icon)
.setPriority(Notification.PRIORITY_MAX)
.setContentIntent(pendingIntent)
.setOngoing(false)
.build();
startForeground(10, notification);
return START_NOT_STICKY;}
@Override
public void onDestroy() {
super.onDestroy();
stopForeground(true);
}
@Override
public IBinder onBind(Intent intent) {
return null;}}