首页 > 代码库 > 通知(Toast+Notification)

通知(Toast+Notification)

Toast简要说明:(前面已经用过好多次了)

  1. Toast是一种非持久的(在屏幕上面留一会儿就消失了),提供给用户简洁提示信息的视图。
  2. 它不阻断用户的操作,一般用于显示一些不重要的信息。(比方说设置音量的那个提示)
  3. Toast类可以用于创建和显示toast信息,toast一般翻译为吐司。

 

常用方法:(有set方法,也有get方法)

  1. Toast.makeText(context, text, duration);  //返回Toast对象
  2. toast.setDuration(duration);  //设置持续时间
  3. toast.setGravity(gravity, xOffset, yOffset);  //设置toast位置,后面的位置偏移参照物是gravity(center/center_horizontal/center_vertical/Bottomd等)
  4. toast.setText(s);  //设置提示内容
  5. toast.show(); //显示

 

 

代码演示一下:

1. 改变位置

clipboard[2]

后面两个是偏移量,是根据前面一个gravity参数来指定的。

 

2. toast显示图片

MainActivity.java

public class MainActivity extends Activity implements OnClickListener{    private Button btn;        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                btn = (Button) findViewById(R.id.btn1);        btn.setOnClickListener(this);                    }    @Override    public void onClick(View v)     {        Toast toast = Toast.makeText(this, "带有图片的toast", Toast.LENGTH_LONG);        LinearLayout toast_layout = (LinearLayout) toast.getView();        ImageView iv = new ImageView(this);        iv.setImageResource(R.drawable.ic_launcher);        toast_layout.addView(iv); //再当前布局中加入一个iamgeview        //toast_layout.addView(iv,0);则是指定线性布局中的索引        toast.show();    }}

(布局文件就只有一个Button控件)

点击按钮,则出现下列情况。

image

 

3. 完全自定义的toast

先要去定义一个布局文件toastlayout.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >        <ImageView           android:layout_width="wrap_content"           android:layout_height="wrap_content"           android:src="@drawable/ic_launcher"/>    <TextView         android:layout_width="match_parent"        android:layout_height="30dp"        android:gravity="center"        android:text="这个是自定义布局的toast"/></LinearLayout>

activity_main.xml

<RelativeLayout 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: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.toastytest.MainActivity" >    <Button        android:id="@+id/btn1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="显示toast"         /></RelativeLayout>

MainActivity.java

public class MainActivity extends Activity implements OnClickListener{    private Button btn;        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                btn = (Button) findViewById(R.id.btn1);        btn.setOnClickListener(this);                    }    @Override    public void onClick(View v)     {        //为控件指定布局        LayoutInflater inflater = LayoutInflater.from(this);        View toast_view = inflater.inflate(R.layout.toastlayout, null);                Toast toast = new Toast(this);        toast.setView(toast_view);         toast.show();    }}

点击效果如下:

image

(toast的用法,一般就是简单的提示作用)


Notification简要说明:

  1. 在设备的状态栏(通知栏)中显示
  2. 显示一条持久化信息
  3. 用到Notification和NotificationManager类

 

在这里,必须要分清3种情况:

  1. 其他应用程序在使用时,突然在通知栏中显示一条Notification
  2. 下拉状态栏,Notification显示一些详细信息
  3. 点击Notification,有相应的应用程序或者activity被激活

 

下面用代码演示一下:

新建一个活动NotificationView.java  (一会儿点击“下拉状态栏”里面的notification时,就跳转这个activity)

public class NotificationView extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState)     {        super.onCreate(savedInstanceState);        setContentView(R.layout.notification);                //点击notification后,在状态栏取消notification        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        nm.cancel(getIntent().getExtras().getInt("notificationID"));    }}

其指定布局为 notification.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <TextView        android:id="@+id/textView1"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="这里是notification的详细信息" /></LinearLayout>

当然还要注册activity—AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.notificationdemo"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="15"        android:targetSdkVersion="19" />    <uses-permission android:name="android.permission.VIBRATE"/>    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity             android:name=".NotificationView"            android:label="Details of notification"            >            <intent-filter >                <action android:name="android.intent.action.MAIN"/>                <category android:name="android.intent.category.DEFAULT"/>            </intent-filter>        </activity>            </application></manifest>

MainActivity.java

public class MainActivity extends Activity implements OnClickListener{    private int notificationID = 1; //用于被激活的activity去销毁notification        @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                Button btn = (Button) findViewById(R.id.button1);        btn.setOnClickListener(this);            }    @Override    public void onClick(View v)     {        displayNotification();    }    private void displayNotification()     {        Intent i = new Intent(this,NotificationView.class);        i.putExtra("notificationID", notificationID);                //PendingIntent 可以让应用程序在后面某个时刻执行一个动作,而不考虑应用程序是否在运行        //PendingIntent android.app.PendingIntent.getActivity(Context context,         //                         int requestCode, Intent intent, int flags) flags是活动启动时的标志        //点击了下拉的notification时,启动一个指定活动        PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,0);                NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);                //没有下拉时显示的notification        Notification notif = new Notification(                R.drawable.ic_launcher,                "还有没下拉时的信息",                System.currentTimeMillis());//发送时间                //下拉时,显示Notification的信息        notif.setLatestEventInfo(this, "下拉时", "详细信息是", pendingIntent);        notif.vibrate = new long[]{100,250,100,500}; //发出震动        nm.notify(notificationID,notif);    }}

主布局里面就一个button

<RelativeLayout 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" >    <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="显示一条通知" /></RelativeLayout>

赶快来看看效果:

image

点击按钮、

image

下拉状态栏:

image

点击该下拉状态栏中的notification

(立刻就跳转到了新的activity)

image

 

小结:

  1. 突然显示了一条notification提示:Notification notif = new Notification( R.drawable.ic_launcher, "还有没下拉时的信息", System.currentTimeMillis());
  2. 下拉显示,需要用到NotificationManager:
    1.     NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

           //下拉时,显示Notification的信息

           notif.setLatestEventInfo(this, "下拉时", "详细信息是", pendingIntent);

           notif.vibrate = new long[]{100,250,100,500}; //发出震动

           nm.notify(notificationID,notif);

  3. 点击下拉的状态栏里面的notification时,跳转:

                         Intent i = new Intent(this,NotificationView.class);
                         i.putExtra("notificationID", notificationID);
                         PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,0);

     补充:PendingIntent 可以让应用程序在后面某个时刻执行一个动作,而不考虑应用程序是否在运行

 

实际上显示和取消通知栏都是NotificationManager在起作用:

        notify(id, notification);

        cancel(id);

构造Notification的时候,如果有初始化,那么就是最开始没有下拉时显示的状况了。

通知栏可以设置,提示音,指示灯,以及震动效果.

 

上面的代码,构建Notification对象的方法其实已经过时了,现在用的比较多的是Builder对象

Builder builder = new Notification.Builder(this);builder.setSmallIcon(R.drawable.ic_launcher); //设置图标builder.setTicker("没有下拉时显示的一个消息");builder.setWhen(System.currentTimeMills()); //设置时间builder.setContentTitle("下拉时标题");builder.setContentText("下拉时详细信息");PendingIntent pIntent = PendingIntent.getActivity(this,0,new Intent("com.example.NotificationView"),0);builder.setContentIntent(pIntent); //点击后跳转builder.setDefaults(Notification.DEFAULT_LIGHTS); //设置指示灯Notification notif = builder.build(); //4.1及以上版本//builder.getNotification();  //4.1以下版本

 

其中:

         builder.setDefaults();

可以传入:

            Notification.DEFAULT_SOUND;

            Notification.DEFAULT_LIGHTS;

            Notification.DEFAULT_VIBRATE;

或者设置一条:(相当于以上三条)

            Notification.DEFUALT_ALL;


通知(Toast+Notification)