Android之Notification类(浅谈)
16lz
2022-08-01
1.概述
在使用手机时,当手机有未接来电,短信,电子邮件,以及其他Application推送的一些消息,这些消息通常会显示在状态栏上,android也提供 了用于处理这些信息的类----Notification&NotificationManager。Notification表示一个持久的通 知,将提交给用户使用NotificationManager,用户使用NotificationManager来发送Notification通知的系 统务。
Notification是一种让你的应用程序在没有开启情况下或在后台运行警示用户用的。eg, BroadCast Receiver/Service/等一些看不见的Activity;
使用Notification&NotificationManager发送通知,大概分为以下四个步骤。
(1).调用getSystemService()方法获取系统的NotificationManager服务;
privateNotificationManagernotificationManager;//定义通知管理器的对象notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
(2).创建一个Notification对象,并为其设置各种属性;
//定义Notification的各种属性inticon=R.drawable.icon;//通知图标CharSequencetickerText="Hello";//状态栏显示的通知文本提示longwhen=System.currentTimeMillis();//通知产生的时间,会在通知信息里显示//用上面的属性初始化NofificationNotificationnotification=newNotification(icon,tickerText,when);/*也可以分开设置Notificationnotification=newNotification();notify.icon=imageId[which];notify.tickerText=title[which];notify.when=System.currentTimeMillis();*//**添加声音*notification.defaults|=Notification.DEFAULT_SOUND;*或者使用以下几种方式*notification.sound=Uri.parse("file:///sdcard/notification/ringer.mp3");*notification.sound=Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI,"6");*如果想要让声音持续重复直到用户对通知做出反应,则可以在notification的flags字段增加"FLAG_INSISTENT"*如果notification的defaults字段包括了"DEFAULT_SOUND"属性,则这个属性将覆盖sound字段中定义的声音*//**添加振动*notification.defaults|=Notification.DEFAULT_VIBRATE;*或者可以定义自己的振动模式:*long[]vibrate={0,100,200,300};//0毫秒后开始振动,振动100毫秒后停止,再过200毫秒后再次振动300毫秒*notification.vibrate=vibrate;*long数组可以定义成想要的任何长度*如果notification的defaults字段包括了"DEFAULT_VIBRATE",则这个属性将覆盖vibrate字段中定义的振动*//**添加LED灯提醒*notification.defaults|=Notification.DEFAULT_LIGHTS;*或者可以自己的LED提醒模式:*notification.ledARGB=0xff00ff00;*notification.ledOnMS=300;//亮的时间*notification.ledOffMS=1000;//灭的时间*notification.flags|=Notification.FLAG_SHOW_LIGHTS;*//**更多的特征属性*notification.flags|=FLAG_AUTO_CANCEL;//在通知栏上点击此通知后自动清除此通知*notification.flags|=FLAG_INSISTENT;//重复发出声音,直到用户响应此通知*notification.flags|=FLAG_ONGOING_EVENT;//将此通知放到通知栏的"Ongoing"即"正在运行"组中*notification.flags|=FLAG_NO_CLEAR;//表明在点击了通知栏中的"清除通知"后,此通知不清除,*//经常与FLAG_ONGOING_EVENT一起使用*notification.number=1;//number字段表示此通知代表的当前事件数量,它将覆盖在状态栏图标的顶部*//如果要使用此字段,必须从1开始*notification.iconLevel=;//*/
(3)为Notification对象设置事件信息
//设置通知的事件消息Contextcontext=getApplicationContext();//上下文CharSequencecontentTitle="MyNotification";//通知栏标题CharSequencecontentText="HelloWorld!";//通知栏内容IntentnotificationIntent=newIntent(this,Main.class);//点击该通知后要跳转的ActivityPendingIntentcontentIntent=PendingIntent.getActivity(this,0,notificationIntent,0);notification.setLatestEventInfo(context,contentTitle,contentText,contentIntent);/*通过一个方法设置事件信息notify.setLatestEventInfo(MainActivity.this,user,title[which],null);
(4)通过NotificationManager类的notify(int id,Notification notification)方法发送Notification通知
notificationManager.notify(NOTIFYID_1,notify);
2.实例 手机登录转态显示
Activity_main.xml布局文件如下(登录界面)
<TableLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/tableLayout1"android:layout_width="fill_parent"android:layout_height="fill_parent"android:gravity="center_vertical"android:stretchColumns="0,3"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.example.eg_loginstatus.MainActivity"><!--第一行--><TableRowandroid:id="@+id/tableRow1"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="用户名:"android:id="@+id/textView1"android:layout_width="wrap_content"android:textSize="24px"android:layout_height="wrap_content"/><EditTextandroid:id="@+id/user"android:textSize="24px"android:layout_width="wrap_content"android:layout_height="wrap_content"android:minWidth="200px"/><TextView/></TableRow><!--第二行--><TableRowandroid:id="@+id/tableRow2"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><TextViewandroid:text="密码:"android:id="@+id/textView2"android:textSize="24px"android:layout_width="wrap_content"android:layout_height="wrap_content"/><EditTextandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:textSize="24px"android:id="@+id/pwd"android:inputType="textPassword"/><TextView/></TableRow><!--第3行--><TableRowandroid:id="@+id/tableRow3"android:layout_width="wrap_content"android:layout_height="wrap_content"><TextView/><Buttonandroid:text="登录"android:id="@+id/login"android:layout_width="wrap_content"android:layout_height="wrap_content"/><Buttonandroid:text="退出"android:id="@+id/quit"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextView/></TableRow></TableLayout>
创建布局列表项items.xml,采用LinearLayout布局,添加TextView和ImageView组件,分别用于显示列表项中的图标和文字。代码如下:
<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/image"android:paddingLeft="10px"android:paddingTop="20px"android:paddingBottom="20px"android:adjustViewBounds="true"android:maxWidth="72px"android:maxHeight="72px"android:layout_height="wrap_content"android:layout_width="wrap_content"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10px"android:layout_gravity="center"android:id="@+id/title"/></LinearLayout>
Java全部代码如下:
packagecom.example.eg_loginstatus;importandroid.support.v7.app.ActionBarActivity;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importandroid.app.AlertDialog;importandroid.app.Notification;importandroid.content.DialogInterface;importandroid.app.NotificationManager;importandroid.os.Bundle;importandroid.view.Menu;importandroid.view.MenuItem;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.SimpleAdapter;importandroid.widget.TableRow;publicclassMainActivityextendsActionBarActivity{finalintNOTIFYID_1=123;//第一个通知的IDprivateStringuser="匿名";//用户名privateNotificationManagernotificationManager;//定义通知管理器的对象@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//获取通知管理器notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);//获取登录按钮Buttonlogin=(Button)findViewById(R.id.login);//为登录按钮设置监听器login.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewview){//TODOAuto-generatedmethodstubEditTextedusr=(EditText)findViewById(R.id.user);if(!"".equals(edusr.getText())){user=edusr.getText().toString();}MainActivity.this.sendNotification();}});Buttonquit=(Button)findViewById(R.id.quit);quit.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewview){//TODOAuto-generatedmethodstubnotificationManager.cancel(NOTIFYID_1);((TableRow)findViewById(R.id.tableRow1)).setVisibility(View.VISIBLE);((TableRow)findViewById(R.id.tableRow2)).setVisibility(View.VISIBLE);((Button)findViewById(R.id.login)).setText("登录");}});}/***发送通知方法*/privatevoidsendNotification(){android.app.AlertDialog.Builderbuilder=newAlertDialog.Builder(MainActivity.this);builder.setIcon(R.drawable.advise);builder.setTitle("我的登录状态");finalintimageId[]=newint[]{R.drawable.img1,R.drawable.img2,R.drawable.img3,R.drawable.img4};finalStringtitle[]=newString[]{"在线","隐身","忙碌","离线"};List<Map<String,Object>>listitems=newArrayList<Map<String,Object>>();//通过for循环将图片id和列表项文字放到Map中,并添加到list集合中for(inti=0;i<imageId.length;i++){Map<String,Object>map=newHashMap<String,Object>();map.put("image",imageId[i]);map.put("title",title[i]);listitems.add(map);}finalSimpleAdapteradapter=newSimpleAdapter(MainActivity.this,listitems,R.layout.items,newString[]{"title","image"},newint[]{R.id.title,R.id.image});builder.setAdapter(adapter,newDialogInterface.OnClickListener(){@SuppressWarnings("deprecation")@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){//TODOAuto-generatedmethodstubNotificationnotify=newNotification();notify.icon=imageId[which];notify.tickerText=title[which];notify.when=System.currentTimeMillis();notify.defaults=Notification.DEFAULT_SOUND;notify.setLatestEventInfo(MainActivity.this,user,title[which],null);notificationManager.notify(NOTIFYID_1,notify);//设置布局中的第一行不显示((TableRow)findViewById(R.id.tableRow1)).setVisibility(View.INVISIBLE);//设置布局中的第二行不显示((TableRow)findViewById(R.id.tableRow2)).setVisibility(View.INVISIBLE);((Button)findViewById(R.id.login)).setText("更改登录状态");}});builder.create().show();}@OverridepublicbooleanonCreateOptionsMenu(Menumenu){//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.getMenuInflater().inflate(R.menu.main,menu);returntrue;}@OverridepublicbooleanonOptionsItemSelected(MenuItemitem){//Handleactionbaritemclickshere.Theactionbarwill//automaticallyhandleclicksontheHome/Upbutton,solong//asyouspecifyaparentactivityinAndroidManifest.xml.intid=item.getItemId();if(id==R.id.action_settings){returntrue;}returnsuper.onOptionsItemSelected(item);}}
更多相关文章
- 【Android(安卓)开发教程】Toast通知
- Android设置通知栏/状态栏透明改变通知栏颜色和app最上部分颜色
- Android(安卓)初识Retrofit
- Android(安卓)用sp存储登录状态以及退出登录
- Android(安卓)使用HttpGet进行登录
- Android(安卓)通知Notification的两种实现方法
- Android点击通知栏,不启动新的activity
- android 通知 Notification
- Android自定义Toast 解决关闭通知 Toast无法弹出