设置,应用和运行下的0个进程和1个服务

时间:2014-03-13 14:43:51

标签: android

如果我在一个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);
}

3 个答案:

答案 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");
    }
}