英文
http://developer.android.com/guide/topics/ui/notifiers/notifications.html
对应的中文翻译
http://leybreeze.com/?p=470
------------------------------------------------------------------我是分割线--------------------------------------------------------------
我想把短信显示,做成和模拟器上的一样,
关键是把Notification的代码放到BroadcastReceiver 类的onReceive方法里,就可以了。
现在代码还有缺点,第二次发短信,会冲掉第一次发的短信,可能是NOTIFICATION_ID的值没换吧。
以后解决。
package com.wdxd.message;
import com.wdxd.R;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import android.widget.Toast;
public class ReceiverMessage extends BroadcastReceiver{
public static final int NOTIFICATION_ID = 10001;
@Override
public void onReceive(Context context, Intent intent) {
showNotification1(context, intent);
}
/*
* 方法一、使用toast显示短消息
*/
private void showTost(Context context, Intent intent) {
String strRes = "android.provider.Telephony.SMS_RECEIVED";
if (intent.getAction().equals(strRes)) {
StringBuilder sb = new StringBuilder();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage currMsg : msg) {
sb.append("您收到了来自:【");
sb.append(currMsg.getDisplayOriginatingAddress());
sb.append("】\n的信息,内容:");
sb.append(currMsg.getDisplayMessageBody());
}
Toast toast = Toast.makeText(context, "收到了短消息: " + sb.toString(),Toast.LENGTH_LONG);
toast.show();
}
}
}
/*
* 方法二、正式的短消息显示
*/
private void showNotification1(Context context, Intent intent) {
//获取短信信息
CharSequence phoneNumFromSend =""; //对方电话号码
CharSequence smsContent =""; //短消息内容
CharSequence tickerText = "你有新短消息";//应该是:对方电话号码+短消息内容
Bundle bundle = intent.getExtras();
if (bundle != null) {
//SMS消息的byte[]存储在pdus中
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] msg = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
msg[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
for (SmsMessage currMsg : msg) {
phoneNumFromSend=currMsg.getDisplayOriginatingAddress();
smsContent=currMsg.getDisplayMessageBody();
}
}
//获取NotificationManager的一个引用
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
//实例化Notification:
int icon = R.drawable.message;
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
//定义Notification的扩展消息和Intent:
Intent notificationIntent = new Intent(context, ReceiverMessage.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, phoneNumFromSend, smsContent, contentIntent);
//将Notification传递给NotificationManager
mNotificationManager.notify(NOTIFICATION_ID, notification);
}
/*
* 方法二、正式的短消息显示,简洁的写法。
*/
private void showNotification2(Context context, Intent intent) {
Notification notification = new Notification(R.drawable.message, "来电话啦...", System.currentTimeMillis());
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, new Intent(context, ReceiverMessage.class), 0);
notification.setLatestEventInfo(context, "来电话啦...嘿嘿", "赶紧接电话,否则误大事了", contentIntent);
NotificationManager notificationManager =
(NotificationManager) context.getSystemService(android.content.Context.NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID, notification);
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wdxd"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" /><!-- -->
<!-- 拍照-->
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
<!-- 拍照用到的。设定文件读写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!-- 获得imsi号,用到的权限 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--通话记录权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" ></uses-permission>
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<!--短信 -->
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<!-- 做地图用到的权限 -->
<!-- 需要 GPS 等应用 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 設定INTERNET權限.因为要使用 GoogleMAP 的 service ,所以需要-->
<uses-permission android:name="android.permission.INTERNET" />
<application android:icon="@drawable/icon" android:debuggable="true">
<!-- 由于 1.0 版本的修改,使得 map 包不再是默认的了,使用的时候需要在 manife点下加入map包 -->
<uses-library android:name="com.google.android.maps" />
<activity android:name=".Index">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".takePicture.TakePicture"></activity>
<activity android:name=".Imsi"></activity>
<activity android:label="短消息显示演示" android:name=".message.testMessage"></activity>
<activity android:label="呼叫列表" android:name=".call.portal.CalllogTabs"></activity>
<activity android:label="MyContactList" android:name=".call.contact.MyContactList"></activity>
<activity android:label="StrangerContactList" android:name=".call.contact.StrangerContactList"></activity>
<activity android:label="AlwaysContactList" android:name=".call.contact.AlwaysContactList"></activity>
<activity android:name=".map.Mapp">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<receiver android:name=".message.ReceiverMessage" android:enabled="true">
<!-- 对哪些广播进行监听-->
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
</manifest>
------------------------------------------------------------------我是分割线--------------------------------------------------------------
广播接收器的onReceiver的有效执行时间是10s,一般情况,当这个方法执行完,接收器就销毁了,但是超过10s,即使没执行完毕,也会自动销毁,所以复杂耗时的操作不要放在这里执行,可以把数据通过intent传给一个activity,或service去处理,具体方法和平时一样的操作,只是如果启动外部APK的组件,activity 需要加上setFlags,service需要加上属性 android:exported="true",这样就没什么问题。
------------------------------------------------------------------我是分割线--------------------------------------------------------------
短信,参考文章。
http://gundumw100.iteye.com/blog/869722
暂时还不理解文中提到的“com.forrest.action.SENDMESSAGE”的含义。
根据下面这句话的意思,是sendBroadcast(com.forrest.action.SENDMESSAGE),出发了broadcastServices类的执行,所以可能“com.forrest.action.SENDMESSAGE”用个字符串代替就行,这里不做验证了。
There are separate methods for activiting each type of component:
* You can initiate a broadcast by passing an Intent to methods like sendBroadcast(), sendOrderedBroadcast(), or sendStickyBroadcast()