Android警报在单独进程中未触发

Android警报在单独进程中未触发,android,multithreading,alarm,Android,Multithreading,Alarm,下面的代码来自我的MANIFEST.XML文件 下面的工作原理: 我有一个转折点: public void onReceive(上下文、意图) 如果没有远程进程,它会工作;如果我添加远程进程,它会停止工作 我错过了什么 好的,让我发布我的异步HTTPGET package com.PageP; import java.io.IOException; import org.apache.http.client.ClientProtocolException; import org.apache

下面的代码来自我的MANIFEST.XML文件

下面的工作原理:

我有一个转折点:
public void onReceive(上下文、意图)

如果没有远程进程,它会工作;如果我添加远程进程,它会停止工作

我错过了什么

好的,让我发布我的异步HTTPGET

package com.PageP;

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;

public class GrabURL extends AsyncTask<String, Void, Void> {
    private HttpClient Client = new DefaultHttpClient();
    private String content;
    private String Error = null;
    private String url = null;

    protected void onPreExecute() {
 //       Dialog.setMessage("Downloading source..");
 //       Dialog.show();
    }

    protected Void doInBackground(String... urls) {
        url = urls[0];
        try {
            HttpGet httpget = new HttpGet(urls[0]);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            content = Client.execute(httpget, responseHandler);
        } catch (ClientProtocolException e) {
            Error = e.getMessage();
            cancel(true);
        } catch (IOException e) {
            Error = e.getMessage();
            cancel(true);
        }

        return null;
    }

    protected void onPostExecute(Void unused) {
      Login.GotURL(content, url);
      Client = null;
    }

}
当我的警报触发时,我希望它也保持清醒,以便在我解码返回HTML的另一端接收数据。我遇到的问题是,当ANDROID进入睡眠模式时,它无法可靠地接收HTML返回的数据

我错过了什么


因为有一个单独的进程通常是个坏主意,所以只需关闭
android:process

我需要它保持清醒足够长的时间来调用异步wget并处理返回的html

我不知道你认为什么是“异步”。我将假设你的字面意思是,你正在用你的应用程序打包一个ARM编译的
wget
二进制文件,这是不可思议的

此外,Android将在几秒钟内终止您的进程,因为它占用了该进程的主应用程序线程。因此,您将浪费RAM、CPU和电池,而没有任何特殊优势

使用
HttpUrlConnection
HttpClient
WakefulIntentService
或您自己的
IntentService
执行HTTP请求(“异步wget”),该服务处理与使用
\u WAKEUP
警报有关的
WakeLock
问题
IntentService
为您提供了一个后台线程(执行长时间运行的工作所必需的),并在不再需要时自动关闭(必需的,这样用户就不会因为任务杀手伤害他们的设备而攻击您)

我可以进入一个do/循环,并在其中睡觉,每隔250毫秒醒来一次,看看数据是否已经输入

如果您使用
HttpUrlConnection
HttpClient
执行HTTP请求,您将通过这些API知道“数据是否已进入”

有固定的时间


如果您使用
HttpUrlConnection
HttpClient
来执行HTTP请求,您将能够指定请求超时时间。

由于使用单独的进程通常不是一个好主意,只需关闭
android:process
。好吧,我的情况如下。我有一个警报,每10分钟触发一次。我需要它保持清醒足够长的时间来调用异步wget并处理返回的html。我想,如果我在一个单独的过程中使用闹钟,我可以进入do/循环,并在其中睡眠,每250毫秒醒来一次,查看数据是否在设定的超时时间内进入,如果在超时时间内,并且一旦收到数据,我就可以释放唤醒锁。然后退出循环。其他想法?我已经添加了更多的代码来向您展示我已经准备好的东西。不,我实际上没有使用WGET。您可以在新发布的代码中看到我正在做什么来调用html。谢谢你的帮助…@user225068:我的答案仍然有效。使用
IntentService
(使用您自己的
WakeLock
)或my
WakefulIntentService
来执行HTTP请求,而不是
AsyncTask
。如果我执行的是非异步请求,程序是否会出现赫基抖动?或者http请求是异步完成的?@user225068:“如果我正在执行非异步请求,程序会不会异常?”——正如我所写的,“
IntentService
为您提供了一个后台线程(执行长时间运行的工作所必需的)”。因此,从主应用程序线程的角度来看,您正在执行“异步请求”。
public static void Ping(String Args) {
 final GrabURL wget = new  GrabURL();
 String url = "";

 url = MyAuth("PING")+ Args;
 wget.execute(PPURL+url);
}