如何创建在应用程序停止时继续运行的服务?我在清单文件中的单独进程中创建服务:
<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;
}
答案 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处理它。
希望这有帮助。