Пользовательская строка состояния уведомления для фоновой загрузки - PullRequest
2 голосов
/ 08 октября 2011

Я новичок в разработке для Android и пытаюсь создать функцию фоновой загрузки для своего приложения.Я следовал этому http://developer.android.com/guide/topics/ui/notifiers/notifications.html#CustomExpandedView, чтобы создать свое собственное уведомление.

Загрузка выполнена, я проверил загруженный файл в SDCard.Кроме того, значок строки состояния и заголовок изменены правильно.

Проблема заключается в том, что настраиваемый макет, который я предоставляю для уведомления, не отображается (разверните под строкой). Здесь приведены соответствующиечасти кода внутри закрытого класса AsyncTask:

    @Override
    protected void onPreExecute() {
        // create and configure the notification
        notification = new Notification(R.drawable.download, "Downloading map..", System.currentTimeMillis());
        notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;

        //create a custom layout for the notification
        myContentView = new RemoteViews(appContext.getPackageName(), R.layout.download_progress);
        myContentView.setImageViewResource(R.id.status_icon, R.drawable.ic_menu_save);
        myContentView.setTextViewText(R.id.status_text, "download in progress");
        myContentView.setProgressBar(R.id.status_progress, 100, 0, false);
        notification.contentView = myContentView;
        notification.contentView.apply(appContext, dl.getListView());

        //instantiate the pending intent
        Intent myIntent = new Intent(appContext, DownloadList.class);
        myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        int requestID = (int) System.currentTimeMillis();
        PendingIntent myPendingIntent = PendingIntent.getActivity(appContext, requestID, myIntent, 0);
        notification.contentIntent = myPendingIntent;

        //add the Notification object to the notification manager
        notificationManager = (NotificationManager) appContext.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(NOTIF_ID, notification);
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        //update progress bar
        notification.contentView.setProgressBar(R.id.status_progress, 100, progress[0], false);
        notificationManager.notify(NOTIF_ID, notification);
    }

}

Обратите внимание, что мой класс DownloadList расширяет ListActivity.

Нужно ли мне делать что-то большее, чем просто "tification.contentView = myContentView; "для того, чтобы надуть макет?

Ответы [ 2 ]

0 голосов
/ 10 октября 2011

В конце концов, это была проблема с эмулятором .....

Это отставало, когда я "перетаскивал" уведомление!Я убил несколько процессорных процессов на моем ПК, что привело к более быстрому эмулятору.

Извлеченный урок.Оставьте тяжелую многозадачность профессионалам или другому ПК.

0 голосов
/ 09 октября 2011

Хм ... Ну, я сравнил твой код с моим кодом, который уже работает ... и я не вижу много различий ... Но, возможно, что одно из этих незначительных отличий важно.

final Notification notification = new Notification(R.drawable.icon, "Downloading", System.currentTimeMillis());
notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;

notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.download_progress);

notification.contentView.setImageViewResource(R.id.status_icon, R.drawable.ic_status);
notification.contentView.setTextViewText(R.id.status_text, "Downloading in progress");
notification.contentView.setProgressBar(R.id.status_progress, 100, progress, false);
Intent notificationIntent = new Intent(MainPage.mainActivity, MainPage.class);
PendingIntent contentIntent = PendingIntent.getActivity(MainPage.mainActivity, 0, notificationIntent, 0);
notification.contentIntent = contentIntent;

//getApplicationContext();
final NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(
                Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_MESSAGE, notification);

Сначала я посмотрел на ваш старый код и заметил, что NOTIF_ID = 1. Я не уверен, что это хорошая идея, потому что, если кто-то еще имеет ID один.Конечно, я мог ошибиться в этом, но я просто набрал число, например 792489743, и я ожидаю, что никто другой не будет иметь такого же числа.Полагаю, это всего лишь мера предосторожности.

Во-вторых, мне не удалось узнать, правильны ли ресурсы?Что говорит трассировка стека?Я полагаю, что он просто вышел бы из этого, если бы там была проблема.

В-третьих, я поставил свою задачу как Service вроде как

public class DownloadService extends IntentService {
    //initializing code and stuff
    private class DownloadTask extends AsyncTask<String, Void, Boolean> {

и я сделал это в doInBackground Таким образом, если пользователь убил приложение или что-то в этом роде, оно не остановило бы загрузку.

Наконец, я никогда не использовал apply Лично я не пользуюсьПосмотрим, как это будет больно, но я не видел ни одного примера, который бы его использовал.

Надеюсь, это поможет некоторым!

...