gpt4 book ai didi

android - 即使屏幕被锁定,如何在后台定期运行服务/线程?

转载 作者:行者123 更新时间:2023-12-03 13:10:21 24 4
gpt4 key购买 nike

我正在开发一个可以每半小时检查一次网络数据的应用程序,我需要确保它在电源打开的情况下一直运行。
现在,我的应用程序的结构是这样的:

  • 主要 Activity :
    警报管理器在 onCreate()
  • 警报接收器:
    启动服务
    获取服务的 partial_wl
  • 服务:
    使用 StrictMode 获取网络数据
    如果需要数据,则弹出 activity_2
  • Activity _2:
    振动
    退出按钮(activity_2.this.finish())

  • 但在测试中,我发现服务将在前 30 分钟后停止(被杀死)。另外,如果我在服务中启动一个用于联网的线程而不是使用 StrictMode,它将在屏幕锁定后 5 分钟内被杀死。

    希望有人可以对此提出建议。真是令人不安。
    非常感谢。

    最佳答案

    共同服务的生命与 Activity 无关。如果您希望它开始定期检查我的服务:
    https://bitbucket.org/kvrus/ocs-android/raw/036de7f0d3579b2a193bcb82309f7f82819508e6/app/src/main/java/koss/ru/oneclickrate/network/EcbEuropeService.java

    /**
    * 定期从网络加载汇率
    * 在广播消息中返回结果。
    * 由 koss 于 16 年 2 月 19 日创建。
    * */
    公共(public)类 EcbEuropeService 扩展服务 {

    public static final String ECB_URL = "http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml";
    public static final int UPDATE_PERIOD = 30000;
    public static final int UPDATE_TICK = 1000;

    public static final String NOTIFICATION = "koss.ru.oneclickrate.receiver";
    public static final String EXTRA_CURRENCIES_MAP = "extra_currencies_map";

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    getUrlData();
    return Service.START_NOT_STICKY;
    }

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

    public Cubes getUrlData() {
    (new AsyncTask<Object, Object, Cubes>() {
    Map<CurrencyType, BigDecimal> result = new EnumMap<CurrencyType, BigDecimal>(CurrencyType.class);

    @Override
    protected Cubes doInBackground(Object... params) {
    Cubes cubes = new Cubes();
    InputStream is = null;
    HttpURLConnection urlConnection = null;
    try {
    URL url = new URL(ECB_URL);
    urlConnection = (HttpURLConnection) url.openConnection();
    is = urlConnection.getInputStream();
    cubes = EcbEuropeResponseParser.parse(is);
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    if(urlConnection!=null) IOUtils.close(urlConnection);
    if(is!=null) IOUtils.closeQuietly(is);
    return cubes;
    }
    }

    @Override
    protected void onPostExecute(Cubes map) {
    super.onPostExecute(map);
    sendBroadcastMessage(map);
    startTimer();
    }
    }).execute();
    return null;
    }

    /**
    * Restarts timer
    * */
    public void startTimer() {
    cdt.cancel();
    cdt.start();
    }

    CountDownTimer cdt = new CountDownTimer(UPDATE_PERIOD, UPDATE_TICK) {
    @Override
    public void onTick(long millisUntilFinished) {

    }

    public void onFinish() {
    getUrlData();
    }
    };

    private void sendBroadcastMessage(Cubes currenciesMap) {
    Intent intent = new Intent(NOTIFICATION);
    intent.putExtra(EXTRA_CURRENCIES_MAP, currenciesMap);
    sendBroadcast(intent);
    }

    关于android - 即使屏幕被锁定,如何在后台定期运行服务/线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35628445/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com