在后台持续运行一个服务

6

持续后台运行服务。例如,启动一个服务,即使应用程序关闭,它也会每20秒显示一次弹出消息。

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);
    }
}

如果您想确保服务在应用关闭后仍然运行,请使用前台服务。 - aldok
4个回答

7

以下代码对我有效...

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及以上版本上无法运行,请参考我的下面的答案 https://dev59.com/v6Hia4cB1Zd3GeqPOh8L#63807172 - Amir Raza

3

被接受的答案在Android 8.0(API级别26)及更高版本中不适用,请参考此处关于Android后台限制的说明。

被接受答案的修改:

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()!?你是否忘记了使用'new'关键字? - IOviSpot
@wEight通知对象。是的,我忘记添加new关键字,因为我在考虑Kotlin语言。 - Amir Raza

2
这段代码对我有效。
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");
                }
            });
        }
    }
}

1
在您的清单文件中声明服务时,请添加以下内容:
android:process=":processname"

这使得服务在单独的进程中运行,因此它不会随应用程序被杀死。
然后,您可以选择是否要使用前台。它将显示一个持久通知,但减少了服务被杀死的可能性。
此外,如果您想创建一个持续运行的服务,请使用 Service,而不是IntentService。 IntentService 在完成其操作后停止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接