【Kotlin】自定義Notifation通知Demo

創建Notifation通知(黑馬程序員小結)

  1. 新建notifationManager類對象,getSystemService的通知欄服務
  2. 構建通知Notification對象的內容,通過NotificationCompat(兼容)的builder(context)方法,set5個參數,分別是標題(Title)內容(Text),時間(When),小圖標和大圖標,補充如果想設置右滑隱藏setOngoing(true)即可。
  3. 最後通過manager對象的notify(1,通知對象)和cancel(1)//這裏的1是id就行了
  4. 處理點擊事件,在2)中追加setContentIntent(寫個方法獲取PendIntent)構建延時意圖
    1)獲取方法,new一個對象是不行的,有三種getActivity,getbroadcast,getservice類型,最終通過intent意圖對象,這裏進入主界面getAC 即可
    2)getAc中4個參數,參數一:context傳this 參數二:請求碼 參數三:intent 參數4:flag:例如FLAG_UPDATE_CURENT有新通知會同步更新
    3)增加intent詳細內容
  5. 修改原生通知爲自定義通知
package com.itheima.notification

import android.app.Notification
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.graphics.BitmapFactory
import android.os.Bundle
import android.support.v4.app.NotificationCompat
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.RemoteViews
import android.widget.Toast

class MainActivity : AppCompatActivity() {
    var manager:NotificationManager? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val args = intent.getStringExtra("args")
        args?.let {
            Toast.makeText(this,args,Toast.LENGTH_SHORT).show();
        }
    }

    fun show(view: View) {
        manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        manager?.notify(1,getNotification())
    }

    /**
     * 創建notification
     * Notification 3.0
     * Notification.Builder 3.0
     *
     */
    private fun getNotification(): Notification? {
        val bitmap = BitmapFactory.decodeResource(resources,R.mipmap.ic_launcher)
        val notification = NotificationCompat.Builder(this)
                .setTicker("正在播放歌曲給過去三月的你")
                .setSmallIcon(R.mipmap.ic_launcher)
//                .setLargeIcon(bitmap)
//                .setContentTitle("給過去三月的你")//通知標題
//                .setContentText("初音")//通知內容
                //自定義通知view
                .setCustomContentView(getRemoteViews())//一個遠程view,彈出和應用非同一進程
                .setWhen(System.currentTimeMillis())
                .setOngoing(true)//設置不能滑動刪除通知
                .setContentIntent(getPendingIntent())//通知欄主體點擊事件
                .build()
        return notification
    }

    /**
     * 創建通知自定義view
     */
    private fun getRemoteViews(): RemoteViews? {
        val remoteViews = RemoteViews(packageName,R.layout.notification)//getPackagename,因爲線程不同,第二個佈局是增設了東西
        //修改標題和內容
        remoteViews.setTextViewText(R.id.title,"給過去三月的你")
        remoteViews.setTextViewText(R.id.artist,"初音")
        //處理上一曲 下一曲  狀態點擊事件 延時意圖給條目設定點擊事件
        remoteViews.setOnClickPendingIntent(R.id.pre,getPrePendingIntent())
        remoteViews.setOnClickPendingIntent(R.id.state,getStatePendingIntent())
        remoteViews.setOnClickPendingIntent(R.id.next,getNextPendingIntent())
        return remoteViews
    }

    /**
     * 下一曲點擊事件
     */
    private fun getNextPendingIntent(): PendingIntent? {
        val intent = Intent(this,MainActivity::class.java)//點擊主體進入當前界面中
        intent.putExtra("args","從通知欄下一曲點擊進來")
        val pendingIntent = PendingIntent.getActivity(this,2,intent,PendingIntent.FLAG_UPDATE_CURRENT)
        return pendingIntent
    }

    /**
     * 播放暫停按鈕點擊事件
     */
    private fun getStatePendingIntent(): PendingIntent? {
        val intent = Intent(this,MainActivity::class.java)//點擊主體進入當前界面中
        intent.putExtra("args","從通知欄播放和暫停點擊進來")
        val pendingIntent = PendingIntent.getActivity(this,3,intent,PendingIntent.FLAG_UPDATE_CURRENT)
        return pendingIntent
    }

    /**
     * 上一曲點擊事件
     */
    private fun getPrePendingIntent(): PendingIntent? {
        val intent = Intent(this,MainActivity::class.java)//點擊主體進入當前界面中
        intent.putExtra("args","從通知欄上一曲點擊進來")
        val pendingIntent = PendingIntent.getActivity(this,4,intent,PendingIntent.FLAG_UPDATE_CURRENT)
        return pendingIntent
    }

    /**
     * 通知欄主體點擊事件
     */
    private fun getPendingIntent(): PendingIntent? {
        val intent = Intent(this,MainActivity::class.java)//點擊主體進入當前界面中
        intent.putExtra("args","從通知欄主體點擊進來")
        val pendingIntent = PendingIntent.getActivity(this,1,intent,PendingIntent.FLAG_UPDATE_CURRENT)
        return pendingIntent
    }

    fun hide(view: View) {
        manager?.cancel(1)
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章