0

アプリケーションの更新サービスを設計する必要があります。この更新サービスは、手がかりからデータを取得し、新しい更新がある場合は GUI を更新する必要があります。最初の部分は簡単ですが、2 番目の部分ではどのようなアプローチが最適ですか?

アプリケーションに登録されるカスタム インテント レシーバーを用意することを考えています。アクティビティにコンテンツを再度読み込むように指示します。さらに、アプリケーションが閉じた場合は、更新について通知するアクティビティからカスタム ダイアログを表示する必要があります。

フィードバックが必要です。同様のサンプル プロジェクトを持っている機関があれば、それを共有して実装の詳細を確認してください。

ありがとう。

4

2 に答える 2

0

考えられる方法は、データをContentProviderに同期し、アクティビティの開始時に登録して、そのプロバイダーの変更を監視することです。

ContentResolver.registerContentObserver()

私が覚えているように、ジャンプノートアプリはこれを使用しています。リンク

于 2012-06-07T07:39:38.783 に答える
0

この更新サービスは、手がかりからデータをプル/ダウンロードします

サービスからダウンロード

ここでの大きな問題は、サービスからアクティビティを更新するにはどうすればよいかということです。次の例では、知らないかもしれない 2 つのクラス、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();
            }
        }
    }
}
于 2012-06-07T07:32:57.197 に答える