后台下载的自定义状态栏通知

时间:2011-10-08 19:07:02

标签: android layout notifications progress-bar status

我是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。

我是否需要做更多的事情,只需“notification.contentView = myContentView;”为了夸大布局?

2 个答案:

答案 0 :(得分:0)

嗯......好吧,我将你的代码与我已经运作的代码进行了比较......我没有看到很多差异......但是,这些微小差异之一可能很重要。

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为1则会怎样。当然我可能会对此有所误解,但我只是在792489743这样的数字中捣乱,我希望没有其他人拥有相同的数字。我想是一个预防措施。

其次,我没有看到资源是否正确?堆栈跟踪说什么?我想如果那里出现问题就会退出它。

第三,我将自己的任务放在Service中,如下所示

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

我在doInBackground中这样做了如果用户杀了应用程序,或者什么不能杀死下载。

最后,我从未使用过apply我个人觉得它不会受到伤害,但我还没有看到一个使用它的例子。

希望这会有所帮助!

答案 1 :(得分:0)

毕竟这是一个模拟器问题.....

当我“拖下”通知时,它落后了!我在PC上杀死了一些CPU广泛的进程,从而使模拟器更快。

经验教训。将重型多任务交给专业人员或其他PC。