繁体   English   中英

当主要活动被破坏时,android服务停止

[英]android service stops when main activity is destroyed

我正在制作一个应用程序,该应用程序会在需要再次孵化怪物蛋时向用户发出通知。 每天每 5 分钟最多可孵化 10 个卵。 我想我会创建一个服务来跟踪已经过去了多少时间,但是每次 MainActivity 在模拟器上关闭时,服务都会停止并调用 onDestroy()。 我做了一个测试服务,看看我是否可以让服务显示日志消息,或者在调用 onDestroy() 时做一些事情。 我能够让服务在 onDestroy() 中运行一个线程,但如果我要实现它,显然这是很危险的。

我也在浏览网站,发现人们推荐 Handler 或 Alarm Manager。 我应该使用这些而不是服务吗? 有人还可以解释为什么 MainActivity 被销毁时我的服务停止了吗? 是否还建议从该服务或我最终使用的任何类中检索/存储应用偏好数据,以便服务和 MainActivity 可以相互通信? 例如,基于计时器何时启动的种子,以便 MainActivity 可以在启动时从种子中创建一个鸡蛋?

(edit)oops 差点忘了:我还需要它,以便在鸡蛋准备好孵化以及当天有另一批鸡蛋准备好时出现通知。 每当用户启动应用程序时,如果用户已经用完当天的鸡蛋,应用程序还应显示另一个鸡蛋或另一批鸡蛋的剩余时间。 认为这个上下文对于确定我是否应该使用服务、警报管理器或处理程序很重要。

import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.IBinder;
import android.util.Log;

import androidx.annotation.Nullable;

public class egg_notifications extends Service {

    public static int time = -1;

    
    public egg_notifications() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        AsyncTask datatask = new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] objects) {
                for(int c=0;c<300;c++){
                    Log.i("d","Time is "+c);
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) { }
                }
                return null;
            }
        }.execute();
        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        Log.i("d","Service onDestroy");
        AsyncTask datatask = new AsyncTask() {
            @Override
            protected Object doInBackground(Object[] objects) {
                for(int c=0;c<300;c++){
                    Log.i("d","Time is "+c);
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) { }
                }
                return null;
            }
        }.execute();
    }

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

}

在现代 Android 中,服务会在 2 分钟后结束。 如果您只需要一个 5 分钟的计时器,请使用 Alarm 和 AlarmManager 设置一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM