Skip to content

Latest commit

 

History

History
129 lines (122 loc) · 6.13 KB

自定义状态栏通知.md

File metadata and controls

129 lines (122 loc) · 6.13 KB

自定义状态栏通知

状态栏通知布局 custom_notification.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="64dp" //这里不用match_parent,因为在有些机型上显示的背景不全,源码中的高度是64dp,这样背景能全部覆盖通知栏的背景
    android:background="@color/white" >
    <ImageView
        android:id="@+id/image"
        android:layout_width="40dip"
        android:layout_height="40dip"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:contentDescription="@string/Image" />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@id/image" >
        <TextView
            android:id="@+id/title"
            style="@style/NotificationTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true" />
        <TextView
            android:id="@+id/text"
            style="@style/NotificationText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/title"
            android:ellipsize="end"
            android:lines="2" />
        <TextView
            android:id="@+id/time"
            style="@style/NotificationText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@id/title"
            android:layout_alignParentRight="true"
            android:layout_marginRight="5dip"
            android:layout_toLeftOf="@id/title" />
    </RelativeLayout>
</RelativeLayout>

这里面的style都是使用的继承系统的文字样式

<!-- 自定义状态栏通知 -->
<style name="NotificationText" parent="android:TextAppearance.StatusBar.EventContent">
    <item name="android:textColor">#bb000000</item>
    <item name="android:textSize">@dimen/notification_text_size</item>
</style>
<style name="NotificationTitle" parent="android:TextAppearance.StatusBar.EventContent.Title">
    <item name="android:textColor">#bb000000</item>
</style>
/**
 * 自定义通知
 */
private void createCustomNotification(Context ctxt, String tickerText,
        int drawable, String title, String content, int id,
    PendingIntent pendingIntent) {
    int icon = R.drawable.ic_launcher;
    long when = System.currentTimeMillis();
    Notification notification = new Notification(icon, tickerText, when);//必须要有这三个参数,不然出来的状态栏显示不全
    RemoteViews contentView = new RemoteViews(mContext.getPackageName(),
            R.layout.custom_notification);
    contentView.setImageViewResource(R.id.image, drawable);
    contentView.setTextViewText(R.id.title, title);
    contentView.setTextViewText(R.id.text, content);
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
    String time = df.format(new Date());
    contentView.setTextViewText(R.id.time,
            time.substring((time.length() - 8), (time.length() - 3)));
    notification.contentView = contentView;
    notification.contentIntent = pendingIntent;
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.defaults = Notification.DEFAULT_SOUND;
    String ns = Context.NOTIFICATION_SERVICE;
    NotificationManager mNotificationManager = (NotificationManager) ctxt
            .getSystemService(ns);
    mNotificationManager.notify(id, notification);
}

/**
 *状态栏通知
 */
public void stateBar(View view) {
    // 1.获取通知管理器
    NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    // 2.创建通知对象
    int icon = R.drawable.icon;                // 图标
    CharSequence tickerText = "下载完成";    // 提示文本
    long when = System.currentTimeMillis();    // 时间
    Notification notification = new Notification(icon, tickerText, when);
    // 3.设置通知
    Context context = getApplicationContext();                // 上下文环境
    String contentTitle = "FeiQ下载完成";                    // 消息标题
    String contentText = "FeiQ.exe下载完成, 耗时1分35秒";    // 消息内容
    Intent intent = new Intent();                            // 用来开启Activity的意图
    intent.setClassName("com.itheima.downloader", "com.itheima.downloader.MainActivity");    // 意图指定Activity
    PendingIntent pedningIntent = PendingIntent.getActivity(this, 100, intent, PendingIntent.FLAG_ONE_SHOT);    // 定义待定意图,第三个参数就是指定如果多个状态栏通知时,后面的通知怎么处理前面的通知
    notification.setLatestEventInfo(context, contentTitle, contentText, pedningIntent);    // 设置通知的具体信息
    notification.flags = Notification.FLAG_AUTO_CANCEL;        // 设置自动清除,如果设置为FLAG_NO_CLEAR就是点击不会删除,像安全卫士程序的状态栏图标点击就不会删除
    // 设置通知的声音
    notification.sound = Uri.parse("file:///mnt/sdcard/jiaodizhu.mp3");     
   // 4.发送通知
   manager.notify(id++, notification);
}

/*这个PendingIntent是指定点击这个状态栏通知的时候的点击事件,注意点击的时候这个状态栏其实是运行在系统的程序中,并不是运行在我们自己的程序中,
而这个pendingIntent就是指定在点击这个通知的时候怎么让别的程序来执行的意图,就是包装出来一个动作让另外一个程序使用、
这个自动清除就是点击一次之后这个通知就在状态栏中自动清除了,
发送通知时的id++就是每次的id值,不同则你发一次通知状态栏上就会显示一个,点多次就发送多个,如果设置为1,则不管点多少次后面的都把前面的给覆盖了*/