首页 > 解决方案 > 如何在android中加载没有webview的url?

问题描述

我想在我的应用程序中每 30 秒(作为服务)在后台加载一个 url。我必须在我的服务类中加载 url,因为它没有布局,所以 webview 不适合这个。即使应用程序关闭,我应该使用什么在后台加载 url?

MyService.java 类

public class MyService extends Service {
Activity activity ;

Handler handler = new Handler();
Runnable runnable;
int delay = 7*1000;

public MyService(Activity activity){
    this.activity = activity ;
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    handler.postDelayed( runnable = new Runnable() {
        public void run() {
            loadURL();

            handler.postDelayed(runnable, delay);
        }
    }, delay);
    return START_STICKY ;
}

@Override
public void onDestroy() {

}

public void loadURL(){
    try{
        String id = activity.getIntent().getStringExtra("ID");
        URL url = new URL("http://localhost/att.php?id=" + id + "&status=&submit=Insert");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
    } catch (Exception e){
        Toast.makeText(this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

}

标签: androidwebviewandroid-service

解决方案


您可以使用新的 WorkManager。

基本上,您创建一个从以下之一扩展的 Worker 类:

Worker CoroutineWorker RxWorker ListenableWorker

然后你像这样声明它:

val mWorker = PeriodicWorkRequestBuilder<Worker>(15, TimeUnit.MINUTES)
            .addTag(WORK_TAG)
            .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
            .build()

然后将独特的工作排入队列,这样工作经理就不会开始更多相同的任务:

  WorkManager.getInstance(context)
            .enqueueUniquePeriodicWork(WORK_TAG, ExistingPeriodicWorkPolicy.KEEP, locationWorker)

当您将 Worker 类扩展为例如 ListenableWorker 时,使用您的代码覆盖 startWork() 函数并在主体中运行:

 handler.postDelayed( runnable = new Runnable() {
        public void run() {
            loadURL();

            handler.postDelayed(runnable, delay);
        }
    }, delay);

推荐阅读