在后台连续运行服务

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"

这让服务在单独的进程上运行,因此它不会被应用程序杀死。

然后您可以选择是否要使用前景。它会显示一个持续的通知,但会降低服务被终止的可能性。

此外,如果您想创建一个持续运行的服务,请使用ServiceNOT IntentService。 IntentService 完成操作后停止。

【讨论】:

以上是关于在后台连续运行服务的主要内容,如果未能解决你的问题,请参考以下文章

如何在后台连续运行 ajax 请求?

在cocoa的后台连续运行代码

如何使应用程序在android中连续运行?

如何在后台连续运行 C# 控制台应用程序

如何在ios中每n秒连续在后台线程中运行一个进程

如何使用 Sidekiq 运行连续的后台作业?