LostFindActivity.java 下邊是設置嚮導: BaseSetupActivity.java Setup1Activity.java styles.xml btn_green_selector.xml //狀態選擇器(selector)設置給view,點擊會有相應的效果 .9.png( ...
LostFindActivity.java
public class LostFindActivity extends Activity { private SharedPreferences mPrefs; private TextView tvSafePhone; private ImageView ivProtect; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPrefs = getSharedPreferences("config", MODE_PRIVATE); boolean configed = mPrefs.getBoolean("configed", false);// 判斷是否進入過設置嚮導 if (configed) { setContentView(R.layout.activity_lost_find); // 根據sp更新安全號碼 tvSafePhone = (TextView) findViewById(R.id.tv_safe_phone); String phone = mPrefs.getString("safe_phone", ""); tvSafePhone.setText(phone); // 根據sp更新保護鎖 ivProtect = (ImageView) findViewById(R.id.iv_protect); boolean protect = mPrefs.getBoolean("protect", false); if (protect) { ivProtect.setImageResource(R.drawable.lock); } else { ivProtect.setImageResource(R.drawable.unlock); } } else { // 跳轉設置嚮導頁 startActivity(new Intent(this, Setup1Activity.class)); finish(); } } /** * 重新進入設置嚮導 * * @param view */ public void reEnter(View view) { startActivity(new Intent(this, Setup1Activity.class)); finish(); } }
activity_lost_find.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView style="@style/TitleStyle" android:text="手機防盜" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:gravity="center_vertical" > <TextView style="@style/ContentStyle" android:text="安全號碼" /> <TextView android:id="@+id/tv_safe_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:textColor="@color/black" android:textSize="16sp" /> </RelativeLayout> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/listview_divider" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:gravity="center_vertical" > <TextView style="@style/ContentStyle" android:text="防盜保護是否開啟" /> <ImageView android:id="@+id/iv_protect" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@drawable/unlock" /> </RelativeLayout> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/listview_divider" /> <TextView android:layout_width="match_parent" android:background="@drawable/shape_selector" android:onClick="reEnter" android:clickable="true" style="@style/ContentStyle" android:layout_margin="5dp" android:text="重新進入設置嚮導" /> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/listview_divider" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="功能簡介" android:layout_margin="5dp" android:textColor="@color/black" android:textSize="18sp" android:background="#5000" /> <TextView style="@style/ContentStyle" android:drawableLeft="@android:drawable/star_big_on" android:gravity="center" android:text="GPS追蹤:#*location*#" /> <TextView style="@style/ContentStyle" android:drawableLeft="@android:drawable/star_big_on" android:gravity="center" android:text="播放報警音樂:#*alarm*#" /> <TextView style="@style/ContentStyle" android:drawableLeft="@android:drawable/star_big_on" android:gravity="center" android:text="遠程刪除數據:#*wipedata*#" /> <TextView style="@style/ContentStyle" android:drawableLeft="@android:drawable/star_big_on" android:gravity="center" android:text="遠程鎖屏:#*lockscreen*#" /> </LinearLayout>
shape_selector.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/gradient_box" android:state_pressed="true"></item> <item android:drawable="@android:color/transparent"></item><!--預設 --> </selector>
gradient_box.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >//矩形 <!-- 漸變顏色 --> <gradient android:angle="45" android:centerColor="#fff" android:endColor="#f00" android:startColor="#0f0" > </gradient> <padding android:bottom="7dp" android:left="7dp" android:right="7dp" android:top="7dp" > </padding> <!-- 角度 --> <corners android:radius="5dp" /> </shape>
下邊是設置嚮導:
BaseSetupActivity.java
//不需要在清單文件中註冊,因為不需要界面展示
public abstract class BaseSetupActivity extends Activity { private GestureDetector mDectector; public SharedPreferences mPref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPref = getSharedPreferences("config", MODE_PRIVATE); // 手勢識別器 mDectector = new GestureDetector(this, new SimpleOnGestureListener() { /** * 監聽手勢滑動事件 e1表示滑動的起點,e2表示滑動終點 velocityX表示水平速度 velocityY表示垂直速度 */ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // 判斷縱向滑動幅度是否過大, 過大的話不允許切換界面 if (Math.abs(e2.getRawY() - e1.getRawY()) > 100) { Toast.makeText(BaseSetupActivity.this, "不能這樣劃哦!", Toast.LENGTH_SHORT).show(); return true; } // 判斷滑動是否過慢 if (Math.abs(velocityX) < 100) { Toast.makeText(BaseSetupActivity.this, "滑動的太慢了!", Toast.LENGTH_SHORT).show(); return true; } // 向右劃,上一頁 if (e2.getRawX() - e1.getRawX() > 200) { showPreviousPage(); return true; } // 向左劃, 下一頁 if (e1.getRawX() - e2.getRawX() > 200) { showNextPage(); return true; } return super.onFling(e1, e2, velocityX, velocityY); } }); } /** * 展示下一頁, 子類必須實現 */ public abstract void showNextPage(); /** * 展示上一頁, 子類必須實現 */ public abstract void showPreviousPage();//手勢識別和點擊按鈕都會進入這裡 // 點擊下一頁按鈕 public void next(View view) { showNextPage(); } // 點擊上一頁按鈕 public void previous(View view) { showPreviousPage(); } @Override public boolean onTouchEvent(MotionEvent event) { mDectector.onTouchEvent(event);// 委托手勢識別器處理觸摸事件 return super.onTouchEvent(event); } }
Setup1Activity.java
public class Setup1Activity extends BaseSetupActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup1); } @Override public void showNextPage() { startActivity(new Intent(this, Setup2Activity.class)); finish(); // 兩個界面切換的動畫 overridePendingTransition(R.anim.trans_in, R.anim.trans_out);// 進入動畫和退出動畫 } @Override public void showPreviousPage() { } }
activity_setup1.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView style="@style/TitleStyle" android:text="1.歡迎使用手機防盜" /> <TextView style="@style/ContentStyle" android:text="您的手機防盜衛士:" /> <TextView style="@style/ContentStyle" android:drawableLeft="@android:drawable/btn_star" android:gravity="center" android:text="SIM卡變更報警" /> <TextView style="@style/ContentStyle" android:drawableLeft="@android:drawable/btn_star" android:gravity="center" android:text="GPS追蹤" /> <TextView style="@style/ContentStyle" android:drawableLeft="@android:drawable/btn_star" android:gravity="center" android:text="遠程銷毀數據" /> <TextView style="@style/ContentStyle" android:drawableLeft="@android:drawable/btn_star" android:gravity="center" android:text="遠程鎖屏" /> <LinearLayout //這是那四個 小點 android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/presence_online" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/presence_invisible" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/presence_invisible" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@android:drawable/presence_invisible" /> </LinearLayout> <RelativeLayout android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" > <ImageView android:id="@+id/iv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:src="@drawable/setup1"/> <Button style="@style/NextStyle" /> </RelativeLayout> </LinearLayout>
styles.xml
<resources> <style name="ContentStyle"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">@color/black</item> <item name="android:textSize">18sp</item> <item name="android:layout_margin">10dp</item> </style> <style name="NextStyle"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_alignParentBottom">true</item> <item name="android:layout_alignParentRight">true</item> <item name="android:background">@drawable/btn_green_selector</item> <item name="android:drawableRight">@drawable/next</item> <item name="android:text">下一步</item> <item name = "android:onClick">next</item> </style> <style name="PreviousStyle"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_alignParentBottom">true</item> <item name="android:layout_alignParentLeft">true</item> <item name="android:background">@drawable/btn_green_selector</item> //將狀態選擇器設置給button <item name="android:drawableRight">@drawable/previous</item> <item name="android:text">上一步</item> <item name = "android:onClick">previous</item> </style> </resources>
btn_green_selector.xml //狀態選擇器(selector)設置給view,點擊會有相應的效果
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:drawable="@drawable/function_greenbutton_pressed" //.9.png android:state_pressed="true" //按下 ></item> <item android:drawable="@drawable/function_greenbutton_pressed"//.9.png android:state_focused="true" //獲取焦點 ></item> <item android:drawable="@drawable/btn_green_normal"></item> //預設 </selector>
.9.png(9patch)圖片的製作:
通過黑色邊線來描述圖片的拉伸情況和填充文字的方式
上邊線-水平拉伸;左邊線-垂直拉伸;右邊線-垂直填充區域;下邊線-水平填充區域
Setup2Activity.java
public class Setup2Activity extends BaseSetupActivity { private SettingItemView sivSim; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup2); sivSim = (SettingItemView) findViewById(R.id.siv_sim); String sim = mPref.getString("sim", null); if (!TextUtils.isEmpty(sim)) { sivSim.setChecked(true); } else { sivSim.setChecked(false); } sivSim.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (sivSim.isChecked()) { sivSim.setChecked(false); mPref.edit().remove("sim").commit();// 刪除已綁定的sim卡 } else { sivSim.setChecked(true); // 選中的話,保存sim卡信息 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); String simSerialNumber = tm.getSimSerialNumber();// 獲取sim卡序列號 System.out.println("sim卡序列號:" + simSerialNumber); mPref.edit().putString("sim", simSerialNumber).commit();// 將sim卡序列號保存在sp中 } } }); } @Override public void showNextPage() { // 如果sim卡沒有綁定,就不允許進入下一個頁面 String sim = mPref.getString("sim", null); if (TextUtils.isEmpty(sim)) { ToastUtils.showToast(this, "必須綁定sim卡!"); return; } startActivity(new Intent(this, Setup3Activity.class)); finish(); // 兩個界面切換的動畫 overridePendingTransition(R.anim.trans_in, R.anim.trans_out);// 進入動畫和退出動畫 } @Override public void showPreviousPage() { startActivity(new Intent(this, Setup1Activity.class)); finish(); // 兩個界面切換的動畫 overridePendingTransition(R.anim.trans_previous_in, R.anim.trans_previous_out);// 進入動畫和退出動畫 } }
BootCompleteReceiver.java
public class BootCompleteReceiver extends BroadcastReceiver {
// 監聽手機開機啟動的廣播
@Override
public void onReceive(Context context, Intent intent) {
SharedPreferences sp = context.getSharedPreferences("config",
Context.MODE_PRIVATE);
boolean protect = sp.getBoolean("protect", false);
// 只有在防盜保護開啟的前提下才進行sim卡判斷
if (protect) {
String sim = sp.getString("sim", null);// 獲取綁定的sim卡
if (!TextUtils.isEmpty(sim)) {
// 獲取當前手機的sim卡
TelephonyManager tm = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
String currentSim = tm.getSimSerialNumber() + "111";// 拿到當前手機的sim卡
if (sim.equals(currentSim)) {
System.out.println("手機安全");
} else {
System.out.println("sim卡已經變化, 發送報警簡訊!!!");
String phone = sp.getString("safe_phone", "");// 讀取安全號碼
// 發送簡訊給安全號碼
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phone, null,
"sim card changed!", null, null);
}
}
}
}
}
![](http://images2015.cnblogs.com/blog/899690/201702/899690-20170207103033651-88667002.png)
我們開啟5554和5556的模擬器,給5554安全號碼設置為5556,我們給5554的sim卡序列號變化,那麼開機重啟5554,開機啟動的廣播就會
檢測到sim卡變更,發送簡訊給5556,5556就會接收到5554發送來的簡訊。
SmsReceiver .java
//攔截簡訊 public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Object[] objects = (Object[]) intent.getExtras().get("pdus"); for (Object object : objects) {// 簡訊最多140位元組, // 超出的話,會分為多條簡訊發送,所以是一個數組,因為我們的簡訊指令很短,所以for迴圈只執行一次 SmsMessage message = SmsMessage.createFromPdu((byte[]) object); String originatingAddress = message.getOriginatingAddress();// 簡訊來源號碼 String messageBody = message.getMessageBody();// 簡訊內容 System.out.println(originatingAddress + ":" + messageBody); if ("#*alarm*#".equals(messageBody)) { // 播放報警音樂, 即使手機調為靜音,也能播放音樂, 因為使用的是媒體聲音的通道,和鈴聲無關 MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs); player.setVolume(1f, 1f); player.setLooping(true); player.start(); abortBroadcast();// 中斷簡訊的傳遞, 從而系統簡訊app就收不到內容了 } else if ("#*location*#".equals(messageBody)) { // 獲取經緯度坐標 context.startService(new Intent(context, LocationService.class));// 開啟定位服務