Android studio 如果没有应用程序´;窗户开了吗?

Android studio 如果没有应用程序´;窗户开了吗?,android-studio,service,Android Studio,Service,这可能很明显,但我对stackoverflow的编程或提问完全陌生,所以如果我不能正确解释自己,我会提前道歉。此外,有些部分我不知道它们是什么,因为代码基本上是教程的混合。 我需要应用程序做的是让它继续做它正在做的事情(处理程序部分),但是当它关闭时(不是最小化)。但是我需要它发送一个通知,而不是改变背景。 换句话说,每10分钟,如果temperBU的值为19,即使应用程序关闭,我也会收到通知。 因此,如果我没有弄错的话,我需要的是服务,但我不知道什么类型的服务更适合这种情况。我尝试了一些教程,

这可能很明显,但我对stackoverflow的编程或提问完全陌生,所以如果我不能正确解释自己,我会提前道歉。此外,有些部分我不知道它们是什么,因为代码基本上是教程的混合。 我需要应用程序做的是让它继续做它正在做的事情(处理程序部分),但是当它关闭时(不是最小化)。但是我需要它发送一个通知,而不是改变背景。 换句话说,每10分钟,如果temperBU的值为19,即使应用程序关闭,我也会收到通知。 因此,如果我没有弄错的话,我需要的是服务,但我不知道什么类型的服务更适合这种情况。我尝试了一些教程,但似乎没有任何效果,如果有可能,在应用程序启动后立即启动服务

公共类MainActivity扩展了AppCompatActivity{

ConstraintLayout layout;

class Weather extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... address) {

        try {
            URL url = new URL(address[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            InputStream is = connection.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            int data = isr.read();
            String content = "";
            char ch;
            while (data != -1) {
                ch = (char) data;
                content = content + ch;
                data = isr.read();
            }
            Log.i("Content", content);
            return content;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    String content;
    Weather weather = new Weather();

    {
        {

            try {
                content = weather.execute("https://api.openweathermap.org/data/2.5/weather?q=budapest,hu&units=metric&appid=ce2fd10cdcc8ab209f979f6a41c27cfe").get();
                JSONObject jsonObject = new JSONObject(content);
                String mainData = jsonObject.getString("main");
                Log.i("mainData", mainData);

                JSONObject object = new JSONObject(mainData);
                Double temp = object.getDouble("temp");
                Log.i("temp", String.valueOf(temp));
                int temperBU = (int) Math.round(temp);
                Log.i("temperBU", String.valueOf(temperBU));

                layout = findViewById(R.id.hs_n);

                if (temperBU == 19)
                    layout.setBackgroundResource(R.drawable.hungry_summer_premium_yes_simple);
                else layout.setBackgroundResource(R.drawable.hungry_summer_premium_no_simple);


                Handler handler = new Handler();

                Runnable r = new Runnable() {
                    public void run() {

                        String content;
                        Weather weather = new Weather();


                        try {
                            content = weather.execute("https://api.openweathermap.org/data/2.5/weather?q=budapest,hu&units=metric&appid=ce2fd10cdcc8ab209f979f6a41c27cfe").get();
                            JSONObject jsonObject = new JSONObject(content);
                            String mainData = jsonObject.getString("main");
                            Log.i("mainData", mainData);//*

                            JSONObject object = new JSONObject(mainData);
                            Double temp = object.getDouble("temp");
                            Log.i("temp", String.valueOf(temp));
                            int temperBU = (int) Math.round(temp);
                            Log.i("temperBU", String.valueOf(temperBU));//*

                            layout = findViewById(R.id.hs_n);

                            if (temperBU == 19)
                                layout.setBackgroundResource(R.drawable.hungry_summer_premium_yes_simple);
                            else
                                layout.setBackgroundResource(R.drawable.hungry_summer_premium_no_simple);


                        } catch (Exception e) {

                            e.printStackTrace();
                        }

                        handler.postDelayed(this::run, 600000);

                    }
                };
                handler.postDelayed(r, 600000);
            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }
}
ConstraintLayout布局;
类天气任务{
@凌驾
受保护的字符串doInBackground(字符串…地址){
试一试{
URL=新URL(地址[0]);
HttpURLConnection connection=(HttpURLConnection)url.openConnection();
connection.connect();
InputStream is=connection.getInputStream();
InputStreamReader isr=新的InputStreamReader(is);
int data=isr.read();
字符串内容=”;
char ch;
while(数据!=-1){
ch=(char)数据;
内容=内容+ch;
data=isr.read();
}
Log.i(“内容”,内容);
返回内容;
}捕获(格式错误){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
字符串内容;
天气=新天气;
{
{
试一试{
内容=天气。执行(“https://api.openweathermap.org/data/2.5/weather?q=budapest,hu&units=metric&appid=ce2fd10cdcc8ab209f979f6a41c27cfe”).get();
JSONObject JSONObject=新的JSONObject(内容);
String mainData=jsonObject.getString(“main”);
Log.i(“mainData”,mainData);
JSONObject对象=新的JSONObject(mainData);
Double temp=object.getDouble(“temp”);
Log.i(“temp”,String.valueOf(temp));
int temperBU=(int)数学四舍五入(temp);
Log.i(“temperBU”,String.valueOf(temperBU));
布局=findViewById(R.id.hs\n);
如果(温度=19)
布局。挫折资源(R.可牵引、饥饿、夏季、高级、是、简单);
else布局。挫折资源(R.可提取、饥饿、夏季、高级、不简单);
Handler=newhandler();
Runnable r=新的Runnable(){
公开募捐{
字符串内容;
天气=新天气;
试一试{
内容=天气。执行(“https://api.openweathermap.org/data/2.5/weather?q=budapest,hu&units=metric&appid=ce2fd10cdcc8ab209f979f6a41c27cfe”).get();
JSONObject JSONObject=新的JSONObject(内容);
String mainData=jsonObject.getString(“main”);
Log.i(“mainData”,mainData)//*
JSONObject对象=新的JSONObject(mainData);
Double temp=object.getDouble(“temp”);
Log.i(“temp”,String.valueOf(temp));
int temperBU=(int)数学四舍五入(temp);
Log.i(“temperBU”,String.valueOf(temperBU))//*
布局=findViewById(R.id.hs\n);
如果(温度=19)
布局。挫折资源(R.可牵引、饥饿、夏季、高级、是、简单);
其他的
布局。挫折资源(R.可牵引、饥饿、夏季、高级、不简单);
}捕获(例外e){
e、 printStackTrace();
}
postdayed(this::run,600000);
}
};
后延迟处理程序(r,600000);
}捕获(例外e){
e、 printStackTrace();
}
}
}
}
}


非常感谢您的帮助。

请注意,AsyncTask已被弃用,因此请使用以下方法进行后台工作:

要在用户关闭应用程序后继续执行操作,请尝试使用前台服务,如下所示:

  • 在Android清单中,添加

    使用权限android:name=“android.permission.FOREGROUND\u服务”

  • 这在应用程序标记内:

    service android:name=".services.WorkerSvc"
    
  • 添加此类:

     class WorkerSvc : Service() {
    
    
     override fun onBind(intent: Intent?): IBinder? {
         return null
     }
    
    
    
     override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
         LogUtil.i("onStartCommand")
         startForeground(
             NotificationUtil.NOTIFICATION_ID,
             NotificationUtil.makeForeGroundNotification(getString(R.string.please_wait))
         )
         processIntent(intent)
         return START_STICKY
     }
    
     private fun processIntent(intent: Intent?) {
         if (intent == null) {
             stopSelf()
         } else {
             // DO YOUR WORK HERE. USE INTENT EXTRAS TO PASS DATA TO SERVICE
             // NOTE THIS IS EXECUTED IN MAIN THREAD SO USE ONE OF THE SOLUTION PROVIDED IN A LINK ABOVE
         }
     }
    
    }

  • 要启动服务,请执行以下操作:

     val svcIntent = Intent(App.instance, WorkerSvc::class.java)
     svcIntent.putExtra(
     //DATA TO PASS TO SERVICE
     )
     if (context != null) {
     ContextCompat.startForegroundService(context, svcIntent)
     }