最近住的地方總在晚上停電,還讓不讓人活了,大熱天的,於是就晚上在外面先找個涼快的地方呆着,但是來電的時間不確定,有時候感覺應該來電了,回去了還是沒電,那個熱啊。那麼問題來了,要是屋裏來電了有人告訴我就好了!於是計劃寫一個小程序讓它在屋裏來電後通知。
利用現用資源:一臺退休的手機
大概思路是這樣的:家裏的路由器是一直連着電源的,老手機是一直開着 wifi 的,來電後路由器通電,自動連接上網絡,這個時候手機也檢測到網絡,連接上了 wifi,然後後臺程序通過此判斷來電了,再讓老手機給我發短信通知,收到來電通知後我就可以回去了吹電扇了!
來來來,開始寫程序
- 首先開啓一個後臺服務
NetCheckService
,1分鐘執行一次。記得 AndroidMenifest.xml 註冊。
/**
* Created by hanks on 16/6/21.
*/
public class NetCheckService extends Service {
public static final String LAST_STATUS = "lastStatus";
@Nullable @Override public IBinder onBind(Intent intent) {
return null;
}
// 服務開啓
@Override public int onStartCommand(Intent intent, int flags, int startId) {
handleIntent();
return super.onStartCommand(intent, flags, startId);
}
protected void handleIntent() {
new Thread(){
@Override public void run() {
while (true){
System.out.println("onStart");
// 判斷是否來電了
handleStatus();
try {
Thread.sleep(60*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("----耗時任務執行完成---");
}
}
}.start();
}
- 檢測網絡
/**
* 檢測當的網絡狀態
* @return true 表示網絡可用
*/
public static boolean isNetworkAvailable(Context context) {
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
// 當前網絡是連接的
if (info.getState() == NetworkInfo.State.CONNECTED) {
// 當前所連接的網絡可用
return true;
}
}
}
return false;
}
- 判斷是否來電了, 記得註冊相應的權限。
private boolean getStatus() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
return sp.getBoolean(LAST_STATUS, false);
}
public void updateStatus(boolean isAvailable) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = sp.edit();
editor.putBoolean(LAST_STATUS, isAvailable);
editor.apply();
}
private void hanldeStatus() {
boolean lastStatus = getStatus();
// 檢測網絡狀況
boolean isNetworkAvailable = isNetworkAvailable(getApplicationContext());
// 如果原來網絡不可用 && 現在可用了
if (!lastStatus && isNetworkAvailable) {
// 發送短信
sendSMS();
}
System.out.println("isNetworkAvailable = " + isNetworkAvailable);
// 更新網絡狀態
updateStatus(isNetworkAvailable);
}
- 定期檢測手機連接網絡的狀態,如果當前網絡是可用狀態並且上次是不可用狀態,那麼就說明來電了,然後就發送短信通知我
發送短信就使用的 ShareSDK 的。自定義短信模板還要審覈,所以暫時用系統默認的。
還不完善的地方:
- 手機服務很有可能被殺死。
- 短信模板。
還有一種思路就是手機一直充着電,檢測手機電池狀態是否爲充電。
文章來自: http://hanks.xyz