簡體   English   中英

IntentService中的廣播接收器

[英]Broadcast Receiver in an IntentService

我試圖在我的IntentService的 onHandleIntent()方法中注冊DownloadManager.ACTION_DOWNLOAD_COMPLETE接收器,並在IntentService的 onDestroy()方法中取消注冊接收器。 但我認為它沒有注冊,因為一旦下載完成,接收器的onReceive()方法就不會被觸發。 誰能幫我這個?

創建服務類,

public class ConnectionBroadReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        ConnectivityManager cm = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        IConnectionCallback callback = (IConnectionCallback) context;
        callback.finishDownload();
}

在活動中,

    ConnectionBroadReceiver broadReceiver = new ConnectionBroadReceiver();
    registerReceiver(broadReceiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

在活動中創建界面和實現,並定義下載后要執行的操作

    public interface IConnectionCallback {
     void finishDownload();

  }

最后在清單中注冊服務,

    <receiver android:name=".ConnectionBroadReceiver">

以下代碼來自

public class MyWebRequestService  extends IntentService{

public static final String REQUEST_STRING = "myRequest";
public static final String RESPONSE_STRING = "myResponse";
public static final String RESPONSE_MESSAGE = "myResponseMessage";

private String URL = null;
private static final int REGISTRATION_TIMEOUT = 3 * 1000;
private static final int WAIT_TIMEOUT = 30 * 1000;

public MyWebRequestService() {
    super("MyWebRequestService");
}

@Override
protected void onHandleIntent(Intent intent) {

    String requestString = intent.getStringExtra(REQUEST_STRING);
    String responseString = requestString + " " + DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis());
    String responseMessage = "";
    SystemClock.sleep(10000); // Wait 10 seconds
    Log.v("MyWebRequestService:",responseString );

    // Do some really cool here
    // I am making web request here as an example...
    try {

        URL = requestString;
        HttpClient httpclient = new DefaultHttpClient();
        HttpParams params = httpclient.getParams();

        HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
        HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
        ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);

        HttpGet httpGet = new HttpGet(URL);
        HttpResponse response = httpclient.execute(httpGet);

        StatusLine statusLine = response.getStatusLine();
        if(statusLine.getStatusCode() == HttpStatus.SC_OK){
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            response.getEntity().writeTo(out);
            out.close();
            responseMessage = out.toString();
        }

        else{
            //Closes the connection.
            Log.w("HTTP1:",statusLine.getReasonPhrase());
            response.getEntity().getContent().close();
            throw new IOException(statusLine.getReasonPhrase());
        }

    } catch (ClientProtocolException e) {
        Log.w("HTTP2:",e );
        responseMessage = e.getMessage();
    } catch (IOException e) {
        Log.w("HTTP3:",e );
        responseMessage = e.getMessage();
    }catch (Exception e) {
        Log.w("HTTP4:",e );
        responseMessage = e.getMessage();
    }


    Intent broadcastIntent = new Intent();
    broadcastIntent.setAction(MyWebRequestReceiver.PROCESS_RESPONSE);
    broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
    broadcastIntent.putExtra(RESPONSE_STRING, responseString);
    broadcastIntent.putExtra(RESPONSE_MESSAGE, responseMessage);
    sendBroadcast(broadcastIntent);

}

}

IntentFilter filter = new IntentFilter(MyWebRequestReceiver.PROCESS_RESPONSE);
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    receiver = new MyWebRequestReceiver();
    registerReceiver(receiver, filter);


@Override
public void onDestroy() {
    this.unregisterReceiver(receiver);
    super.onDestroy();
}

public class MyWebRequestReceiver extends BroadcastReceiver{
    public static final String PROCESS_RESPONSE = "com.as400samplecode.intent.action.PROCESS_RESPONSE";
    @Override
    public void onReceive(Context context, Intent intent) {
        String responseString = intent.getStringExtra(MyWebRequestService.RESPONSE_STRING);
        String reponseMessage = intent.getStringExtra(MyWebRequestService.RESPONSE_MESSAGE);
        TextView myTextView = (TextView) findViewById(R.id.response);
        myTextView.setText(responseString);
        WebView myWebView = (WebView) findViewById(R.id.myWebView);
        myWebView.getSettings().setJavaScriptEnabled(true);
        try {
            myWebView.loadData(URLEncoder.encode(reponseMessage,"utf-8").replaceAll("\\+"," "), "text/html", "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

}

public class MyWebRequestService  extends IntentService{

public static final String REQUEST_STRING = "myRequest";
public static final String RESPONSE_STRING = "myResponse";
public static final String RESPONSE_MESSAGE = "myResponseMessage";

private String URL = null;
private static final int REGISTRATION_TIMEOUT = 3 * 1000;
private static final int WAIT_TIMEOUT = 30 * 1000;

public MyWebRequestService() {
    super("MyWebRequestService");
}

@Override
protected void onHandleIntent(Intent intent) {

    String requestString = intent.getStringExtra(REQUEST_STRING);
    String responseString = requestString + " " + DateFormat.format("MM/dd/yy h:mmaa", System.currentTimeMillis());
    String responseMessage = "";
    SystemClock.sleep(10000); // Wait 10 seconds
    Log.v("MyWebRequestService:",responseString );

    // Do some really cool here
    // I am making web request here as an example...
    try {

        URL = requestString;
        HttpClient httpclient = new DefaultHttpClient();
        HttpParams params = httpclient.getParams();

        HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
        HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT);
        ConnManagerParams.setTimeout(params, WAIT_TIMEOUT);

        HttpGet httpGet = new HttpGet(URL);
        HttpResponse response = httpclient.execute(httpGet);

        StatusLine statusLine = response.getStatusLine();
        if(statusLine.getStatusCode() == HttpStatus.SC_OK){
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            response.getEntity().writeTo(out);
            out.close();
            responseMessage = out.toString();
        }

        else{
            //Closes the connection.
            Log.w("HTTP1:",statusLine.getReasonPhrase());
            response.getEntity().getContent().close();
            throw new IOException(statusLine.getReasonPhrase());
        }

    } catch (ClientProtocolException e) {
        Log.w("HTTP2:",e );
        responseMessage = e.getMessage();
    } catch (IOException e) {
        Log.w("HTTP3:",e );
        responseMessage = e.getMessage();
    }catch (Exception e) {
        Log.w("HTTP4:",e );
        responseMessage = e.getMessage();
    }


    Intent broadcastIntent = new Intent();
    broadcastIntent.setAction(MyWebRequestReceiver.PROCESS_RESPONSE);
    broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
    broadcastIntent.putExtra(RESPONSE_STRING, responseString);
    broadcastIntent.putExtra(RESPONSE_MESSAGE, responseMessage);
    sendBroadcast(broadcastIntent);

}

}

IntentFilter filter = new IntentFilter(MyWebRequestReceiver.PROCESS_RESPONSE);
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    receiver = new MyWebRequestReceiver();
    registerReceiver(receiver, filter);


@Override
public void onDestroy() {
    this.unregisterReceiver(receiver);
    super.onDestroy();
}

public class MyWebRequestReceiver extends BroadcastReceiver{
    public static final String PROCESS_RESPONSE = "com.as400samplecode.intent.action.PROCESS_RESPONSE";
    @Override
    public void onReceive(Context context, Intent intent) {
        String responseString = intent.getStringExtra(MyWebRequestService.RESPONSE_STRING);
        String reponseMessage = intent.getStringExtra(MyWebRequestService.RESPONSE_MESSAGE);
        TextView myTextView = (TextView) findViewById(R.id.response);
        myTextView.setText(responseString);
        WebView myWebView = (WebView) findViewById(R.id.myWebView);
        myWebView.getSettings().setJavaScriptEnabled(true);
        try {
            myWebView.loadData(URLEncoder.encode(reponseMessage,"utf-8").replaceAll("\\+"," "), "text/html", "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

}

在Manifest中創建服務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM