Android意图和服务

时间:2012-06-07 07:25:50

标签: android service android-intent

我需要为应用程序设计更新服务,此更新服务将从clued中提取数据,如果有新的更新,它应该更新GUI。第一部分是直接的,但第二部分是最好的方法是什么?

我正在考虑拥有一个将在应用程序中注册的自定义意图接收器,它将告诉活动再次加载内容。此外,如果应用程序关闭,我需要显示一个关于更新的活动的自定义对话框。

我需要您的反馈,如果有任何机构有类似的示例项目,请分享它以查看实施细节。

感谢。

2 个答案:

答案 0 :(得分:0)

  

此更新服务将从clued

中提取/下载数据

从服务下载

这里最大的问题是:如何从服务更新我的活动?在下一个示例中,我们将使用您可能不知道的两个类:ResultReceiver和IntentService。 ResultReceiver是允许我们从服务更新线程的那个; IntentService是Service的一个子类,它从那里生成一个线程来执行后台工作(你应该知道一个Service实际上在你的应用程序的同一个线程中运行;当你扩展Service时,你必须手动生成新的线程来运行CPU阻塞操作)

下载服务可能如下所示:

public class DownloadService extends IntentService {
    public static final int UPDATE_PROGRESS = 8344;
    public DownloadService() {
        super("DownloadService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        String urlToDownload = intent.getStringExtra("url");
        ResultReceiver receiver = (ResultReceiver) intent.getParcelableExtra("receiver");
        try {
            URL url = new URL(urlToDownload);
            URLConnection connection = url.openConnection();
            connection.connect();
            // this will be useful so that you can show a typical 0-100% progress bar
            int fileLength = connection.getContentLength();

            // download the file
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream("/sdcard/BarcodeScanner-debug.apk");

            byte data[] = new byte[1024];
            long total = 0;
            int count;
            while ((count = input.read(data)) != -1) {
                total += count;
                // publishing the progress....
                Bundle resultData = new Bundle();
                resultData.putInt("progress" ,(int) (total * 100 / fileLength));
                receiver.send(UPDATE_PROGRESS, resultData);
                output.write(data, 0, count);
            }

            output.flush();
            output.close();
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Bundle resultData = new Bundle();
        resultData.putInt("progress" ,100);
        receiver.send(UPDATE_PROGRESS, resultData);
    }
}

将服务添加到您的清单:

<service android:name=".DownloadService"/>
  

如果有新的更新,它应该更新GUI

活动将如下所示:

//初始化进度对话框,如第一个示例

//这是你解雇下载程序的方法

mProgressDialog.show();
Intent intent = new Intent(this, DownloadService.class);
intent.putExtra("url", "url of the file to download");
intent.putExtra("receiver", new DownloadReceiver(new Handler()));
startService(intent);

以下是ResultReceiver来玩:

private class DownloadReceiver extends ResultReceiver{
    public DownloadReceiver(Handler handler) {
        super(handler);
    }

    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        super.onReceiveResult(resultCode, resultData);
        if (resultCode == DownloadService.UPDATE_PROGRESS) {
            int progress = resultData.getInt("progress");
            mProgressDialog.setProgress(progress);
            if (progress == 100) {
                mProgressDialog.dismiss();
            }
        }
    }
}

答案 1 :(得分:0)

一种可行的方法是将您的数据同步到ContentProvider,当您的活动开始时,注册以通过

观察该提供商的变化
ContentResolver.registerContentObserver()

我记得跳转应用程序使用了这个。 link