1

ファイルをダウンロードできる Android アプリを作成しました。サービスをサポートするためにGroundy ライブラリ
を使用しました。そして、これからNotiThreadを作成しましたただし、要件をサポートするために編集しました)..これ が私のアクティビティコードです...

public class PacksActivity extends Activity {

private Context context;
private RelativeLayout download;
private ProgressBar progressBar;
private NotiThread notification;
private String url;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.packs);

    context = this;
    url = getIntent().getStringExtra("URL");

    progressBar = (ProgressBar)findViewById(R.id.progress);
    progressBar.setIndeterminate(false);
    progressBar.setMax(100);
    download = (RelativeLayout) findViewById(R.id.label_circle);
    download.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            File dest = new File(context.getFilesDir(), new File(url).getName());
            if(!dest.exists()){
                progressBar.setVisibility(View.VISIBLE);
                notification = new NotiThread(context);
                notification.run();
                Bundle extras = new Bundler().add(DownloadTemplate.PARAM_URL, url).build();
                Groundy.create(context, DownloadTemplate.class)
                        .receiver(mReceiver)
                        .params(extras)
                        .queue();
            }
        }
    });
}

private ResultReceiver mReceiver = new ResultReceiver(new Handler()) {
    @Override
    protected void onReceiveResult(int resultCode, Bundle resultData) {
        super.onReceiveResult(resultCode, resultData);
        switch (resultCode) {
            case Groundy.STATUS_PROGRESS:
                int progress = resultData.getInt(Groundy.KEY_PROGRESS);
                progressBar.setProgress(progress);
                if((progress % 10) == 0)notification.progressUpdate(progress);
                break;
            case Groundy.STATUS_FINISHED:
                Toast.makeText(context, "Success Download file", Toast.LENGTH_LONG);
                progressBar.setVisibility(View.GONE);
                notification.completed();
                break;
            case Groundy.STATUS_ERROR:
                Toast.makeText(context, resultData.getString(Groundy.KEY_ERROR), Toast.LENGTH_LONG).show();
                progressBar.setVisibility(View.GONE);
                notification.completed();
                break;
        }
    }
};
}

これは私の NotiThread クラスです

public class NotiThread extends Thread {

private NotificationManager mNoti = null;

private final Context mContext;
private final int mUnique;
private Notification noti;

public NotiThread(Context context) {
    super("NotiThread");
    mContext = context;
    mNoti = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    mUnique = 1;
}

@Override
public void run() {
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

    noti = new Notification(R.drawable.icon1024, "title", System.currentTimeMillis());
    noti.flags |= Notification.FLAG_ONGOING_EVENT;

    RemoteViews contentView = new RemoteViews(mContext.getPackageName(), R.layout.custom_notification);
    contentView.setTextViewText(R.id.noti_title, "title");
    contentView.setProgressBar(R.id.noti_progress, 100, 0, false);
    contentView.setTextViewText(R.id.noti_text, "0%");
    noti.contentView = contentView;

    noti.contentIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, mContext.getClass()), PendingIntent.FLAG_ONE_SHOT);

    mNoti.notify(mUnique, noti);
}

public void progressUpdate(int percentageComplete) {
    noti.contentView.setProgressBar(R.id.noti_progress, 100, percentageComplete, false);
    noti.contentView.setTextViewText(R.id.noti_text, percentageComplete + "%");
    mNoti.notify(mUnique, noti);
}

public void completed()    {
    mNoti.cancel(mUnique);
}
}

これが GroundyTask クラスです

public class DownloadTemplate extends GroundyTask {

public static final String PARAM_URL = "com.app.service.PARAM_URL";

@Override
protected boolean doInBackground() {
    try {
        String url = getParameters().getString(PARAM_URL);
        File dest = new File(getContext().getFilesDir(), new File(url).getName());
        DownloadUtils.downloadFile(getContext(), url, dest, DownloadUtils.getDownloadListenerForTask(this));
        return true;
    } catch (Exception e) {
        return false;
    }
}
}

アクティビティに入るときに現在実行中のサービスと通知から ProgressBar を更新するアクティビティを再開する方法を教えてください。

4

1 に答える 1

0

アクティビティに戻ったときに、サービスがまだ実行されているかどうかを確認できます。私がそれを行う方法は、シングルトン Network クラスを使用することです。ここで、Groundy create 関数で使用されるコールバック オブジェクトを定義します。このシングルトンは、タスクの状態 (実行中、またはキャンセル、終了、または失敗したときに実行されていない) も追跡します。アクティビティが再度作成されたとき、このシングルトン クラスはまだ存在するため、進行中のコールバックは引き続き発生します。確認する必要があるのは、リスナーを新しいアクティビティから既存のシングルトンに再登録することだけです。ここに簡単な例があります..

シングルトン クラス:

public static SingletonClass getInstance(Object o) {
    if (instance == null) {
        instance = new SingletonClass();
    }
    if (o instanceof OnProgressListener) {
        progressListener = (OnProgressListener) o;
     }
    ...
    return instance;
}

コールバック オブジェクト:

    public Object callbackObject = new Object() {
       @OnProgress(YourGroundyTask.class)
       public void onProgress(@Param(Groundy.PROGRESS) int progress) {
        if (progressListener != null){
            progressListener.onDownloadProgress(progress);
        }
       }
       ...
于 2014-03-18T17:46:17.430 に答える