在后台连续运行服务
Posted
技术标签:
【中文标题】在后台连续运行服务【英文标题】:Run a service in background continuously 【发布时间】:2017-09-19 08:23:12 【问题描述】:。例如,必须启动一个服务,即使应用程序关闭,它也会在 20 秒内显示一次 toast 消息。
public class AppService extends IntentService
public int onStartCommand(Intent intent, int flags, int startId)
return START_STICKY;
public AppService()
super("AppService");
@Override
protected void onHandleIntent(Intent workIntent)
Toast.makeText(getApplicationContext(), "hai", Toast.LENGTH_SHORT).show();
SystemClock.sleep(20000);
【问题讨论】:
如果你想确保服务在应用关闭后仍然运行,那么使用前台服务。 【参考方案1】:下面的代码对我有用...
public class AppService extends Service
@Override
public IBinder onBind(Intent intent)
// TODO Auto-generated method stub
return null;
@Override
public void onCreate()
Toast.makeText(this, " MyService Created ", Toast.LENGTH_LONG).show();
@Override
public int onStartCommand(Intent intent, int flags, int startId)
Toast.makeText(this, " MyService Started", Toast.LENGTH_LONG).show();
return START_STICKY;
【讨论】:
这不适用于 android Oreo API 级别 26,请参阅下面的答案 ***.com/questions/43557840/…【参考方案2】:接受的答案不适用于 Android 8.0(API 级别 26),请参阅 android 的后台限制here
已接受答案的修改:
1:你必须在服务启动后5秒内调用服务的startForeground()
方法。为此,您可以在onCreate()
服务方法中调用startForeground()
。
public class AppService extends Service
....
@Override
public void onCreate()
startForeground(9999, Notification())
....
2:您必须调用startForegroundService()
而不是startService()
,方法是检查您要启动服务的API 级别。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
context.startForegroundService(intent);
else
context.startService(intent);
【讨论】:
什么是 Notification() !?您是否缺少“新”关键字? @wEight 通知对象。是的,忘记添加new
keywork,因为我正在考虑 Kotlin 语言。【参考方案3】:
这段代码对我有用..
public class ServiceClass extends Service
public static final int notify = 300000; //interval between two services(Here Service run every 5 Minute)
private Handler mHandler = new Handler(); //run on another Thread to avoid crash
private Timer mTimer = null; //timer handling
@Override
public IBinder onBind(Intent intent)
throw new UnsupportedOperationException("Not yet implemented");
@Override
public void onCreate()
if (mTimer != null) // Cancel if already existed
mTimer.cancel();
else
mTimer = new Timer(); //recreate new
mTimer.scheduleAtFixedRate(new TimeDisplay(), 0, notify); //Schedule task
@Override
public void onDestroy()
super.onDestroy();
mTimer.cancel(); //For Cancel Timer
Log.d("service is ","Destroyed");
//class TimeDisplay for handling task
class TimeDisplay extends TimerTask
@Override
public void run()
// run on another thread
mHandler.post(new Runnable()
@Override
public void run()
Log.d("service is ","running");
);
【讨论】:
【参考方案4】:在您声明服务的清单中,添加:
android:process=":processname"
这让服务在单独的进程上运行,因此它不会被应用程序杀死。
然后您可以选择是否要使用前景。它会显示一个持续的通知,但会降低服务被终止的可能性。
此外,如果您想创建一个持续运行的服务,请使用Service
,NOT IntentService
。 IntentService 完成操作后停止。
【讨论】:
以上是关于在后台连续运行服务的主要内容,如果未能解决你的问题,请参考以下文章