利用 Android 手機打造來電通知計劃

最近住的地方總在晚上停電,還讓不讓人活了,大熱天的,於是就晚上在外面先找個涼快的地方呆着,但是來電的時間不確定,有時候感覺應該來電了,回去了還是沒電,那個熱啊。那麼問題來了,要是屋裏來電了有人告訴我就好了!於是計劃寫一個小程序讓它在屋裏來電後通知。

利用現用資源:一臺退休的手機
大概思路是這樣的:家裏的路由器是一直連着電源的,老手機是一直開着 wifi 的,來電後路由器通電,自動連接上網絡,這個時候手機也檢測到網絡,連接上了 wifi,然後後臺程序通過此判斷來電了,再讓老手機給我發短信通知,收到來電通知後我就可以回去了吹電扇了!

來來來,開始寫程序

  1. 首先開啓一個後臺服務 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();
    }
  1. 檢測網絡
 /**
 * 檢測當的網絡狀態
 * @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;
}
  1. 判斷是否來電了, 記得註冊相應的權限
 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);
}
  1. 定期檢測手機連接網絡的狀態,如果當前網絡是可用狀態並且上次是不可用狀態,那麼就說明來電了,然後就發送短信通知我
    發送短信就使用的 ShareSDK 的。自定義短信模板還要審覈,所以暫時用系統默認的。

收到短信

還不完善的地方:
- 手機服務很有可能被殺死。
- 短信模板。

還有一種思路就是手機一直充着電,檢測手機電池狀態是否爲充電。

文章來自: http://hanks.xyz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章