标签:android style blog http io ar color os 使用
勤能补拙是良训,一分辛劳一分才。
本讲内容:通知 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><?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="@drawable/ic_launcher"/>
<TextView
android:id="@+id/fileName"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toRightOf="@id/imageView"
android:layout_alignBottom="@id/imageView"
android:gravity="center_vertical"
android:textColor="#0f0"/>
<TextView
android:id="@+id/rate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/imageView"
android:layout_alignRight="@id/imageView"
android:gravity="center"
android:text="0%"
android:textColor="#0f0"/>
<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/fileName"
android:layout_alignLeft="@id/fileName"
android:max="100"
android:progress="0"/>
</RelativeLayout>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 style blog http io ar color os 使用
原文地址:http://blog.csdn.net/liguojin1230/article/details/41382125