最近住的地方总在晚上停电,还让不让人活了,大热天的,于是就晚上在外面先找个凉快的地方呆着,但是来电的时间不确定,有时候感觉应该来电了,回去了还是没电,那个热啊。那么问题来了,要是屋里来电了有人告诉我就好了!于是计划写一个小程序让它在屋里来电后通知。

利用现用资源:一台退休的手机
大概思路是这样的:家里的路由器是一直连着电源的,老手机是一直开着 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 的。自定义短信模板还要审核,所以暂时用系统默认的。

Android 来电通知下发 手机来电通知_路由器

还不完善的地方:
- 手机服务很有可能被杀死。
- 短信模板。

还有一种思路就是手机一直充着电,检测手机电池状态是否为充电。