首页 > 代码库 > 第五十讲:Android之Nothfication(三)

第五十讲:Android之Nothfication(三)

勤能补拙是良训,一分辛劳一分才。


本讲内容:通知 Notification 和 通知管理器 NotificationManager


我们通过一个例子实现一个可更新进度的通知,代码的讲解都写在注释里了

下面是res/layout/activity_main.xml 布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.text1.MainActivity$PlaceholderFragment" >
	<Button 
	    android:id="@+id/download"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="download"
	    android:onClick="download"/>
	<Button 
	    android:id="@+id/cancel"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:text="cancel"
	    android:onClick="cancel"/>
	<!-- 为了使示例中的Java代码看起来结构更加清晰,我们将按钮的点击事件都定义在布局文件中。 -->
</LinearLayout>

下面是带进度的通知布局/res/layout/download_notification_layout.xml自定义布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="3dp">
    <ImageView 
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="3dp"
        android:src=http://www.mamicode.com/"@drawable/ic_launcher"/>>
下面是MainActivity.java主界面文件:

public class MainActivity extends Activity {
	private Notification notification;
	private NotificationManager notificationManager;
	private static final int NOTIFY_ID=0;
	private boolean flag;
	private Context context=this;
	
	private Handler handler=new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:
				int rate=msg.arg1;
				if(rate<100){
					 // 更新进度  
                    RemoteViews contentView = notification.contentView;  
                    contentView.setTextViewText(R.id.rate, rate + "%");  
                    contentView.setProgressBar(R.id.progress, 100, rate, false);  
				}else{
					// 下载完毕后变换通知形式  
                    notification.flags = Notification.FLAG_AUTO_CANCEL;  
                    notification.contentView = null;  
                    Intent intent = new Intent(context, NotifyActivity.class);  
                    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);  
                    notification.setLatestEventInfo(context, "下载完成", "文件已下载完毕", contentIntent);  
				}
				 // 最后别忘了通知一下,否则不会更新  
                notificationManager.notify(NOTIFY_ID, notification);
				break;

			case 0:
				 // 取消通知  
                notificationManager.cancel(NOTIFY_ID);  
                break; 
			}
		};
	};
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	public void download(View view){
		notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
		  
        int icon = R.drawable.ic_launcher;  
        CharSequence tickerText = "开始下载";  
        long when = System.currentTimeMillis();  
        notification = new Notification(icon, tickerText, when); 
     // 放置在"正在运行"栏目中  
        notification.flags = Notification.FLAG_ONGOING_EVENT;  
        
        //点击通知时不跳转 
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, getIntent(), 0); 
        
        RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.download_notification_layout);  
        contentView.setTextViewText(R.id.fileName, "AngryBird.apk");  
        // 指定个性化视图  
        notification.contentView = contentView; 
        // 指定内容意图  
       notification.contentIntent = contentIntent; 
  
        notificationManager.notify(NOTIFY_ID, notification);  
  
        new Thread() {  
            public void run() {  
                startDownload();  
            };  
        }.start();  
	}
	 public void cancel(View view) {  
	        flag = true; // 在控制下载线程时使用了flag这个boolean值标志变量,对于线程的控制更好一些
	    }  
	 private void startDownload() {  
	        flag = false;  
	        int rate = 0;  
	        while (!flag && rate < 100) {  
	            try {  
	                // 模拟下载进度  
	                Thread.sleep(500);  
	                rate = rate + 5;  
	            } catch (InterruptedException e) {  
	                e.printStackTrace();  
	            }  
	            Message msg = handler.obtainMessage();  
	            msg.what = 1;  
	            msg.arg1 = rate;  
	            handler.sendMessage(msg);  
	        }  
	        if (flag) {  
	            Message msg = handler.obtainMessage();  
	            msg.what = 0;  
	            handler.sendMessage(msg);  
	        }  
	    }  
}
上面涉及到线程和handler类,后面章节我们会深入讲解


下面是运行结果:



本讲就到这里,Take your time and enjoy it

第五十讲:Android之Nothfication(三)