首页 > 解决方案 > 在android中杀死应用程序后后台服务无法正常工作

问题描述

我试图在服务中每 15 秒加载一次 URL (API)。一切正常,但是当应用程序被杀死时,不会调用 URL。我的应用程序中不需要任何 UI。我只是希望它在应用程序被杀死时在后台工作。我已经找到了两天的解决方案,但没有任何效果。请帮忙!这是我的服务代码:

public class MyService extends Service {
Handler handler = new Handler();
Runnable runnable;
int delay = 15*1000;
String data ;

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

@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
    handler.postDelayed( runnable = new Runnable() {
    public void run() {
    data = (String) intent.getExtras().get("data");
    Toast.makeText(MyService.this, ""+data, Toast.LENGTH_SHORT).show();
    loadURL(data);

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

@Override
public void onDestroy() {
    handler.postDelayed( runnable = new Runnable() {
            public void run() {
                    Toast.makeText(MyService.this, ""+data, Toast.LENGTH_SHORT).show();
                    loadURL(data);
                    handler.postDelayed(runnable, delay);
            }
    }, delay);
}

public void loadURL(String data){
    try{
            RequestFuture<JSONObject> requestFuture=RequestFuture.newFuture();
            final String mURL = "http://192.168.1.12/att.php?emp_id=" + data + "&status=&submit=Insert";
            JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,
                    mURL,new JSONObject(),requestFuture,requestFuture);
            MySingleton.getInstance(this).addToRequestQueue(request);
            Toast.makeText(this, "Done", Toast.LENGTH_SHORT).show();
            try {
                    JSONObject object= requestFuture.get(10, TimeUnit.SECONDS);
            } catch (Exception e) {
                    e.printStackTrace();
            }
    } catch (Exception e){
    Toast.makeText(this, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
    }
  }
}

这是我的 MainActivity.java ,我在其中获得了一个 userID 的意图:

public class MainActivity extends AppCompatActivity {

String data;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    data = getIntent().getStringExtra("ID");
    Intent intent = new Intent(MainActivity.this, MyService.class);
    intent.putExtra("data", data);
    startService(intent);
  }
}

标签: androidandroid-serviceandroid-volleyandroid-workmanager

解决方案


由于从 Android Oreo 开始的称为后台执行限制的限制,您必须将该后台服务转换为前台服务。

请查看此链接以获得更好的理解: https ://developer.android.com/about/versions/oreo/background


推荐阅读