如果我在一个Activity中使用startService启动服务,我会得到:
1 processes and 1 service
如果我现在刷掉那个活动。我删除它,我得到:
0 processes and 1 service
这是为什么?什么是流程以及Android世界中的服务是什么?
我使用START_STICKY,如果我通过设置,应用和运行停止服务,它不会再次启动,为什么?
Update1一些代码:
Activity:
startService(new Intent(getApplicationContext(), MyService.class));
Service:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "Starting service");
return(START_STICKY);
}
答案 0 :(得分:1)
android世界中进程的定义是什么?与任何操作系统中定义的相同 - 您的应用程序是" alive"从系统的角度来看,它具有活动的内存分配堆栈,可以运行或不运行活动,服务等......
我认为你挣扎过你的生活"运行过程怎么样= 0"但是服务= 1没有制作场景,你是对的。
设置应用程序显示的正在运行的应用程序显示不仅适用于开发人员,也适用于用户,我想这就是为什么大多数供应商决定将活动任务显示为进程的原因。基本上,在这个显示中 - 运行进程=运行任务。
大多数应用程序只启动一个任务(启动器标志的主要活动在该模式下自动启动)。只有当其他活动明确地以该标志开始时,才会有更多的任务。
因此,如果您的应用有2个以new task mode开头的活动 - 您将看到" 2进程"。
如果你的应用程序根本没有运行(你的进程真的没有活动) - 那么你就不会在正在运行的应用程序界面中看到该应用程序。
答案 1 :(得分:1)
原来是KitKat中的一个错误。 (有时我认为在Android中完成任何事情都是一件很麻烦的事情!)
Android Services: START_STICKY does not work on Kitkat
https://code.google.com/p/android/issues/detail?id=63793
修复服务:
@Override
public void onTaskRemoved(Intent rootIntent) {
Intent restartService = new Intent(getApplicationContext(), this.getClass());
restartService.setPackage(getPackageName());
PendingIntent restartServicePI = PendingIntent.getService(
getApplicationContext(), 1, restartService,
PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +1000, restartServicePI);
}
答案 2 :(得分:0)
您的案例中的主要问题是,当应用程序关闭时,您无法启动该服务,那时Android操作系统将终止该服务,如果您无法重新启动该服务,请调用alam manger以启动此类接收器,
清单是,
<service
android:name=".BackgroundService"
android:description="@string/app_name"
android:enabled="true"
android:label="Notification" />
<receiver android:name="AlarmReceiver">
<intent-filter>
<action android:name="REFRESH_THIS" />
</intent-filter>
</receiver>
IN Main Activty以这种方式启动报警管理器,
String alarm = Context.ALARM_SERVICE;
AlarmManager am = (AlarmManager) getSystemService(alarm);
Intent intent = new Intent("REFRESH_THIS");
PendingIntent pi = PendingIntent.getBroadcast(this, 123456789, intent, 0);
int type = AlarmManager.RTC_WAKEUP;
long interval = 1000 * 50;
am.setInexactRepeating(type, System.currentTimeMillis(), interval, pi);
这将调用reciver和reciver,
public class AlarmReceiver extends BroadcastReceiver {
Context context;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
System.out.println("Alarma Reciver Called");
if (isMyServiceRunning(this.context, BackgroundService.class)) {
System.out.println("alredy running no need to start again");
} else {
Intent background = new Intent(context, BackgroundService.class);
context.startService(background);
}
}
public static boolean isMyServiceRunning(Context context, Class<?> serviceClass) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
if (services != null) {
for (int i = 0; i < services.size(); i++) {
if ((serviceClass.getName()).equals(services.get(i).service.getClassName()) && services.get(i).pid != 0) {
return true;
}
}
}
return false;
}
}
当打开Android应用程序并关闭应用程序时,这个Alaram会调用一次。服务是这样的,
public class BackgroundService extends Service {
private String LOG_TAG = null;
@Override
public void onCreate() {
super.onCreate();
LOG_TAG = "app_name";
Log.i(LOG_TAG, "service created");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(LOG_TAG, "In onStartCommand");
//ur actual code
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// Wont be called as service is not bound
Log.i(LOG_TAG, "In onBind");
return null;
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onTaskRemoved(Intent rootIntent) {
super.onTaskRemoved(rootIntent);
Log.i(LOG_TAG, "In onTaskRemoved");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(LOG_TAG, "In onDestroyed");
}
}