一、使用通知
通知的作用
1.显示接收到短消息、即时消息等信息(如QQ、微信、新浪、短信)
2.显示客户端的推送消息(如有新版本发布,广告、推荐新闻)
3.显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)
通知的布局
Notification支持文字内容显示、震动、三色灯、铃声等多种提示形式,在默认情况下,Notification仅显示消息标题、消息内容、送达时间这3项内容,以下就是通知的基本布局。
通知的基本布局:
普通视图:
高度64dp
大视图的通知在展开前也显示为普通视图
元素:
1.标题 Title/Name
2.大图标 icon/Photo
3. 内容信息 MESSAGE
4. 小图标 Secondary icon
5.通知的时间 Timestamp,默认为系统发出通知的时间,也可通过setWhen()来设置
相关分析
状态通知栏主要涉及到2个类:Notification和NotificationManager
Notification为通知信息类、它里面对应了通知栏的各个属性
NotificationManager:是状态栏通知的管理类,负责发通知、清除通知等操作。
注意:NotificationManager是一个系统Service,所以必须通过getSystemService(NOTIFICATION_SERVICE);
实现系统默认的通知栏管理 :
第一步:获取状态通知栏管理:
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
第二步:实例化通知栏构造器NotificationCompat.Builder:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
第三步:对Builder进行配置:
mBuilder.setContentTitle("测试标题")//设置通知栏标题
.setContentText("测试内容") /<span style="font-family: Arial;">/设置通知栏显示内容</span>
.setContentIntent(getDefalutIntent(Notification.FLAG_AUTO_CANCEL)) //设置通知栏点击意图
// .setNumber(number) //设置通知集合的数量
.setTicker("测试通知来啦") //通知首次出现在通知栏,带上升动画效果的
.setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间
.setPriority(Notification.PRIORITY_DEFAULT) //设置该通知优先级
// .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消
.setOngoing(false)//ture,设置他为一个正在进行的通知。他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
.setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单、最一致的方式是使用当前的用户默认设置,使用defaults属性,可以组合
//Notification.DEFAULT_ALL Notification.DEFAULT_SOUND 添加声音 // requires VIBRATE permission
.setSmallIcon(R.drawable.ic_launcher);//设置通知小ICON
通过setContentIntent(PendingIntent intent)设置相应启动的组件
PendingIntent 的用法同样很简单,它主要提供了几个静态方法用于获取 PendingIntent 的
实例,可以根据需求来选择是使用 getActivity()方法、 getBroadcast()方法、还是 getService()
方法。这几个方法所接收的参数都是相同的,第一个参数依旧是 Context,不用多做解释。
第二个参数一般用不到,通常都是传入 0 即可。第三个参数是一个 Intent 对象,我们可以通
过这个对象构建出 PendingIntent 的“意图”。第四个参数用于确定 PendingIntent 的行为,有
FLAG_ONE_SHOT、 FLAG_NO_CREATE、 FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_CURRENT 这四种值可选
PendingIntent getDefalutIntent(int flags){
Intent intent = new Intent(this,NotificationActivity.class);
PendingIntent pendingIntent= PendingIntent.getActivity(this, 1, intent, flags);
return pendingIntent;
}
四、调用 NotificationManager 的 notify()方法就可以让通知显示
出来了。
manager.notify(1, mBuilder.build()); //第一参数为id,保证每个通知的id不同,第二个参数为通知对象
运行效果
点击通知后
二、短信的接收、拦截、和发送
短信的接收采用了广播机制,当手机接收到一条短信的时候,系统会发出一条值为 android.provider.Telephony.SMS_RECEIVED 的广播,该广播携带短信的所有内容。每个应用都可以对它进行监听,收到广播时,从中解析出短信的相关内容就行。
接收短信
package com.example.smstest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.provider.Telephony;
import android.provider.Telephony.Sms;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextView sender;
private TextView content;
private IntentFilter receiveFilter;
private MessageReceiver messageReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sender = (TextView) findViewById(R.id.sender);
content = (TextView) findViewById(R.id.content);
receiveFilter = new IntentFilter();
receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
messageReceiver = new MessageReceiver();
registerReceiver(messageReceiver, receiveFilter);
}
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(messageReceiver);
}
class MessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("SMS----", "onReceives0");
getSmsMessage2(context, intent);
}
@SuppressLint("NewApi")
public String getSmsMessage1(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
SmsMessage smsMessage;
if (Build.VERSION.SDK_INT >= 19) { // KITKAT
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent);
smsMessage = msgs[0];
} else {
Object pdus[] = (Object[]) bundle.get("pdus");
smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]);
}
return "";
}
@SuppressLint("NewApi")
public String getSmsMessage2(Context context, Intent intent) {
Log.v("SMS----", "getSmsMessage2");
Bundle myBundle = intent.getExtras();
SmsMessage[] messages = null;
String strMessage = "";
if (myBundle != null) {
Log.v("SMS----", "getSmsMessage~");
Object[] pdus = (Object[]) myBundle.get("pdus");
messages = new SmsMessage[pdus.length];
for (int i = 0; i < messages.length; i++) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
String format = myBundle.getString("format");
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i], format);
} else {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
strMessage+="index="+i;
strMessage += "SMS From:" + messages[i].getOriginatingAddress();
strMessage += " : ";
strMessage += messages[i].getMessageBody();
strMessage += "\n";
}
Log.v("SMS----", "getSmsMessage~2"+strMessage);
Log.v("SMS", strMessage);
Toast.makeText(context, strMessage, Toast.LENGTH_SHORT).show();
}
return "";
}
}
}
需要给程序声明短信接收权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.smstest"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.RECEIVE_SMS" />
……
</manifest>
短信的拦截
短信的拦截分两步:
一提高 MessageReceiver 的优先级,让它能够先
于系统短信程序接收到短信广播
receiveFilter.setPriority(100);
二、在 onReceive()方法中调用 abortBroadcast()方法,中止掉广播的继续传递。
abortBroadcast();
参考:
1.《安卓第一行代码》
2.博客