Notification

 新年将近,无钱过年,于是自我娱乐一下。(如有侵权,请告知)


要实现的

具体实现是在应用中有一个按钮,点击按钮后会退回到桌面,

之后手机振动,然后你可以在别人的注视下很惊奇的拿起手机,然后看到以上的通知

具体实现:

首先是主界面的布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    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">

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="start"
        android:text="点击我"
        android:textSize="20dp"
        android:paddingLeft="40dp"
        android:paddingRight="40dp"
        android:paddingTop="20dp"
        android:paddingBottom="20dp"
        android:layout_centerInParent="true"/>
</RelativeLayout>
比较简单:就是在布局中央放置一个按钮,通过属性android:onClick="start"可知,点击按钮时会调用start函数


下面是MainActivity.java:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //点击按钮会调用start函数,start函数会启动Myservice服务
    public void start(View view){
        startService(new Intent(this,Myservice.class));
    }
}

比较简单,start函数中会启动服务Myservice


下面重点来看看Myservice.java:
Myservice的作用是1.发送通知,2.退回桌面


1.android的发送通知需要 调用android的系统服务,android通过NotificationManager来管理,你要发送通知就让它去做就好了。(翻译起来好像是通知经理,我每次使唤它, 总有种自己是总经理的感觉,非常爽)

        那我们如何告知它要做什么呢?

通过Notification.Buider来构建,这相当于一个Word文档,你在里面把你要做什么给写好,把word一保存仍给经理就好了。如下:

//把经理先叫出来,用getSystemService(NOTIFICATION_SERVICE)方法来叫
notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
//把构建工具打开,相当于打开word文档吧
builder = new NotificationCompat.Builder(this);

   然后如果你想在桌面出现提示:如下图

   

就用setTicker来设置,如下

//这个是设置图片的,一定要设置!!!否则通知不会显示在通知栏
builder.setSmallIcon(R.mipmap.ic_launcher);

//获得当前的时间
Date startTime = new Date(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String time = sdf.format(startTime);
//设置桌面的提示
builder.setTicker("尊敬的用户,您的账号于" +time+"转入100,000,000元");

一。然后你打开通知栏,通知一般由标题,内容,和图片组成:

分别对应builder.setContentTitle("我是标题啊");

              builder.setContentText("我是内容啊");

          以及图片的builder.setSmallIcon(R.mipmap.ic_lancer);

设置好后如何把word文档保存出来? 用build()方法像下面这样:

          Notification notification = builder.build();

如何扔给经理:用notify(int id,Notification notification)方法,像下面这样:

          notificationManager.notify(1,notification);

大功告成,然后你就可以得到:



二。如果你想搞定高级的,比如收到通知时会振动,加上builder.setVibrate(new long[]{0,100,0,100});

还有声音builder.setSound,  呼吸灯builder.setLights(),

还可以设置通知的优先级builder.setPriority()


三。偷偷告诉你,如果这时你这个通知点击后是不会消失的,要想让它消失,可以通过以下4种方式:

  • 点击通知栏的清除按钮,会清除所有可清除的通知
  • 设置了 setAutoCancel() 或 FLAG_AUTO_CANCEL的通知,点击该通知时会清除它
  • 通过 NotificationManager 调用 cancel() 方法清除指定ID的通知
  • 通过 NotificationManager 调用 cancelAll() 方法清除所有该应用之前发送的通知
四。最后我们还得装装B,不用系统的格式,用自定义的
先贴上我们打算用的布局activitys.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    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.testing.myapplication.MainActivity">
    <ImageView
        android:id="@+id/icon_iv"
        android:layout_width="64dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:layout_toRightOf="@id/icon_iv"/>
    <TextView
        android:id="@+id/content_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/icon_iv"
        android:layout_margin="10dp"
        android:layout_below="@id/title_tv" />
    <TextView
        android:id="@+id/time_tv"
        android:singleLine="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/title_tv"
        android:layout_alignTop="@id/title_tv"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp"/>
</RelativeLayout>
然后是具体的设置代码:
RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.activitys);
//自定义布局的标题
remoteViews.setTextViewText(R.id.title_tv, "交通银行");
//自定义布局的内容
remoteViews.setTextViewText(R.id.content_tv, "尊敬的用户,您的账号于" +time+"转入100,000,000元");
//自定义布局的显示的时间
remoteViews.setTextViewText(R.id.time_tv, time);
//自定义布局显示的图片
remoteViews.setImageViewResource(R.id.icon_iv, R.drawable.gogo);
//创建点击通知时调用的意图
Intent intent = new Intent(this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
int requestCode = (int) SystemClock.uptimeMillis();
pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//设置点击时调用的意图
remoteViews.setOnClickPendingIntent(R.id.time_tv, pendingIntent);
//把word创建出来
Notification notification = builder.build();
//给通知设置自定义布局
if(android.os.Build.VERSION.SDK_INT >= 16) {
    notification = builder.build();
    notification.bigContentView = remoteViews;
}
notification.contentView = remoteViews;
//把word扔给经理,搞定了
notificationManager.notify(1,notification);


注意:如果使用contentView,通知展示的高度只有64dp,一般只有两行文字的高度,很多自定义布局都可能展示不全,而如果用bigContentView,高度可以达到256dp,就绰绰有余了。


以下是Myservice.java代码,大功告成

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.v7.app.NotificationCompat;
import android.util.Log;
import android.widget.RemoteViews;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by devel on 2017/1/12.
 */

public class Myservice extends Service {
    NotificationManager notificationManager ;
    NotificationCompat.Builder builder;
    PendingIntent pendingIntent;

    public void click(){
        //把经理先叫出来,用getSystemService(NOTIFICATION_SERVICE)方法来叫
        notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        //把构建工具打开,相当于打开word文档吧
        builder = new NotificationCompat.Builder(this);
        //这个是设置图片的,一定要设置!!!否则通知不会显示在通知栏
        builder.setSmallIcon(R.mipmap.ic_launcher);

        //获得当前的时间
        Date startTime = new Date(System.currentTimeMillis());
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String time = sdf.format(startTime);
        //设置桌面的提示
        builder.setTicker("尊敬的用户,您的账号于" +time+"转入100,000,000元");
        //builder.setFullScreenIntent(pendingIntent, true);

        RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.activitys);
        //自定义布局的标题
        remoteViews.setTextViewText(R.id.title_tv, "交通银行");
        //自定义布局的内容
        remoteViews.setTextViewText(R.id.content_tv, "尊敬的用户,您的账号于" +time+"转入100,000,000元");
        //自定义布局的显示的时间
        remoteViews.setTextViewText(R.id.time_tv, time);
        //自定义布局显示的图片
        remoteViews.setImageViewResource(R.id.icon_iv, R.drawable.gogo);
        //创建点击通知时调用的意图
        Intent intent = new Intent(this, SecondActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        int requestCode = (int) SystemClock.uptimeMillis();
        pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        //设置点击时调用的意图
        remoteViews.setOnClickPendingIntent(R.id.time_tv, pendingIntent);
        //把word创建出来
        Notification notification = builder.build();
        //给通知设置自定义布局
        if(android.os.Build.VERSION.SDK_INT >= 16) {
            notification = builder.build();
            notification.bigContentView = remoteViews;
        }
        notification.contentView = remoteViews;
        //把word扔给经理,搞定了
        notificationManager.notify(1,notification);
        //退回桌面
        Intent i = new Intent(Intent.ACTION_MAIN);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        i.addCategory(Intent.CATEGORY_HOME);
        startActivity(i);
    }

    @Override
    public void onCreate() {
        super.onCreate();

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                click();
            }
        },3000);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


另外,Android 5.0(API level 21)开始,通知可以显示在锁屏上。用户可以通过设置选择是否允许敏感的通知内容显示在安全的锁屏上。

如果想在锁屏情况下也显示可以通过setVisibility()控制通知的显示等级:

  • VISIBILITY_PRIVATE : 显示基本信息,如通知的图标,但隐藏通知的全部内容
  • VISIBILITY_PUBLIC : 显示通知的全部内容
  • VISIBILITY_SECRET : 不显示任何内容,包括图标

参考:Notification详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值