如何创建一个在应用程序停止时继续运行的服务?我在清单文件中的单独进程中创建服务:
<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; }
解决方法
我不会使用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 startId) { // This is triggered by the service action start intent return super.onStartCommand(intent,flags,startId); } }
现在你的服务应该运行.为了帮助延长寿命,有一些技巧.使其作为前台服务运行(您在服务中执行此操作) – 这将使您创建一个粘贴在状态栏中的通知图标.同时保持你的HEAP光,使你的应用程序不太可能被Android杀死.
当你杀死DVM时服务也会被杀死 – 因此,如果你要去设置 – >应用程序并停止应用程序,你就会杀死DVM,从而导致服务中断.仅仅因为您看到您的应用程序在设置中运行并不意味着Activity正在运行.活动和服务具有不同的生命周期,但可以共享DVM.请记住,如果不需要,你不必杀死你的活动,只需让Android处理它.
希望这可以帮助.