我如何让服务无限期地活着?

我正在编写一个应用程序,用于在某些audio条件满足时(特别是当它检测到通过辅助audio设备读取卡片时)从耳机插孔检测audio并广播Intents。

我的应用程序没有任何活动,它只是一个应用程序和服务

除了在相对较短的时间(〜一分钟)之后,服务被Android清理之外,一切都可以很好地工作。

我很好奇我需要做什么来告诉Android,这是一个有用的服务,它应该保持独立,除非它真的需要回忆它的内存。 我意识到,我可以创build一个闹钟,每隔几秒醒来,如果发现它不在那里,就会启动服务,但是这看起来像是一个疯子。 有更多的Android(y)方法来保持它的活着?

Solutions Collecting From Web of "我如何让服务无限期地活着?"

我的应用程序没有任何活动,它只是一个应用程序和服务。

这意味着您的应用将永远不会在任何Android 3.1+设备上运行,除非您与某些要手动启动服务的其他应用程序有某种联系。

我正在编写一个应用程序,用于在某些audio条件满足时(特别是当它检测到通过辅助audio设备读取卡片时)从耳机插孔检测audio并广播Intents。

不要以几何形状命名你的公司 – 已经完成了。 🙂

我很好奇我需要做什么来告诉Android,这是一个有用的服务,它应该保持独立,除非它真的需要回忆它的内存。

欢迎使用startForeground()声明它是一个前台服务。 权衡是,你将需要显示一个Notification ,理想情况下,允许用户停止服务。 请记住,用户可能不喜欢这个Notification ,但你坚持下去,特别是在Android 4.3以上 。 从服务切换到活动可能会更好,因此用户可以启动该服务,刷卡并处理任何事务。

使用START_STICKY保持你的服务。

 @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("LocalService", "Received start id " + startId + ": " + intent); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } 

使用示例:

http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

更多信息:

http://developer.android.com/reference/android/app/Service.html#START_STICKY

我试过AlarmManager。 有用。 我在AlarmReceiver中使用了Contex.startService()。 我可以检查我的服务是否正在运行,以决定是否再次启动服务。 所以,即使我的服务被用户在设置中手动停止或被某些清理应用程序终止,服务也可以重新启动。 以下是主要代码。

  package com.example.androidnetwork; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends ActionBarActivity { private static final long INTERVAL = 5 * 1000; // unit: ms private Button mRegisterReceiverBtn; private Button mCheckNetStatusBtn; private Button mStopButton; private AlarmManager mAlarmManager; private PendingIntent mPendingIntent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); initView(); } private void initData() { mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); } private void initView() { mRegisterReceiverBtn = (Button) findViewById(R.id.activity_main_start_btn); mCheckNetStatusBtn = (Button) findViewById(R.id.activity_main_start_check_net_status_bnt); mStopButton = (Button) findViewById(R.id.activity_main_stop); mRegisterReceiverBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { MainActivity.this.createServiceControllerPendIntent(); mAlarmManager.setInexactRepeating( AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, INTERVAL, mPendingIntent); } }); mCheckNetStatusBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { MainActivity.this.startActivity(new Intent(MainActivity.this, NetStatusActivity.class)); } }); mStopButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mPendingIntent != null) { mAlarmManager.cancel(mPendingIntent); } else { createServiceControllerPendIntent(); mAlarmManager.cancel(mPendingIntent); } // MainActivity.this.stopService(ServiceController // .getServiceIntent()); Intent intent = new Intent(); intent.setClass(getApplicationContext(), NetStatusMonitorService.class); stopService(intent); } }); } private void createServiceControllerPendIntent() { Intent intent = new Intent(MainActivity.this, ServiceController.class); mPendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); } @Override protected void onDestroy() { deInitView(); super.onDestroy(); } private void deInitView() { } public static class ServiceController extends BroadcastReceiver { private static Intent sMonitorServiceIntent = null; @Override public void onReceive(Context context, Intent intent) { Log.d("Service Controller", "onReceiver"); if (isServiceRunning(context, NetStatusMonitorService.class) == false) { String info = "starting service by AlarmManager"; Log.d("Service Controller", info); sMonitorServiceIntent = new Intent(context, NetStatusMonitorService.class); context.startService(sMonitorServiceIntent); } } // this method is very important private boolean isServiceRunning(Context context, Class<?> serviceClass) { ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo serviceInfo : am .getRunningServices(Integer.MAX_VALUE)) { String className1 = serviceInfo.service.getClassName(); String className2 = serviceClass.getName(); if (className1.equals(className2)) { return true; } } return false; } public static Intent getServiceIntent() { return sMonitorServiceIntent; } } } 

您将无法限制用户从设置中运行服务来手动终止服务。 即使作为设备pipe理员。

你可以添加启动接收器,屏幕锁和任何事件,这将重新启动杀死的服务,应用程序,如果它也是你可以重新启动标志设置的服务,如果杀死一个应用程序杀死高级任务杀手。