Android:创建在应用程序停止时运行的服务

时间:2012-03-16 16:01:24

标签: android service process lifecycle

如何创建在应用程序停止时继续运行的服务?我在清单文件中的单独进程中创建服务:

<service
    android:name="com.example.myservice"
    android:process=":remoteservice" />

我也在服务的onStartCommand中返回START_STICKY:

@Override
public in onStartCommand(Intent intent, int flags, int startId){
    return Service.START_STICKY;
}

1 个答案:

答案 0 :(得分:4)

我不会使用android:process属性 - 这实际上是在一个单独的进程中运行您的服务,并且很难执行共享首选项等操作。当您的应用程序终止时,您不必担心您的服务将会死亡,服务将继续运行(这是服务的重点)。您也不需要绑定服务,因为绑定服务会启动和死亡。话虽如此:

<service
    android:enabled="true"
    android:exported="true"
    android:name=".MyService"
    android:label="@string/my_service_label"
    android:description="@string/my_service_description"
    <intent-filter>
        <action android:name="com.package.name.START_SERVICE" />
    </intent-filter>
</service>

您可以为启动服务的意图定义自己的操作(系统无法启动 - 必须是活动)。我喜欢将“enabled”设置为true,以便系统可以实例化我的服务,并“导出”,以便其他应用程序可以发送意图并与我的服务进行交互。您可以找到有关此here的更多信息。

您还可以创建一个使用绑定的长时间运行服务,如果您这样做只是为绑定器添加和意图,例如:

<action android:name="com.package.name.IRemoteConnection" />

现在从您的活动开始服务:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent serviceIntent = new Intent("com.package.name.START_SERVICE");
        this.startService(serviceIntent);

        // You can finish your activity here or keep going...
    }
}

现在服务:

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // This is triggered by the binder action intent.
        // You can return your binder here if you want...
        return null;
    }


    @Override
    public void onCreate() {
        // Called when your service is first created.
    }

    @Override
    public in onStartCommand(Intent intent, int flags, int startId) {
        // This is triggered by the service action start intent
        return super.onStartCommand(intent, flags, startId);
    }
}

现在你的服务应该运行了。为了帮助延长寿命,有一些技巧。使其作为前台服务运行(您在服务中执行此操作) - 这将使您创建一个粘贴在状态栏中的通知图标。同时保持HEAP光线,使您的应用程序不太可能被Android杀死。

当你杀死DVM时,服务也会被杀死 - 因此,如果你要去设置 - >应用程序并停止应用程序,你就会杀死DVM,从而导致服务中断。仅仅因为您看到您的应用程序在设置中运行并不意味着Activity正在运行。活动和服务具有不同的生命周期,但可以共享DVM。请记住,如果不需要,你不必杀死你的活动,只需让Android处理它。

希望这有帮助。