最近住的地方总在晚上停电,还让不让人活了,大热天的,于是就晚上在外面先找个凉快的地方呆着,但是来电的时间不确定,有时候感觉应该来电了,回去了还是没电,那个热啊。那么问题来了,要是屋里来电了有人告诉我就好了!于是计划写一个小程序让它在屋里来电后通知。
利用现用资源:一台退休的手机
大概思路是这样的:家里的路由器是一直连着电源的,老手机是一直开着 wifi 的,来电后路由器通电,自动连接上网络,这个时候手机也检测到网络,连接上了 wifi,然后后台程序通过此判断来电了,再让老手机给我发短信通知,收到来电通知后我就可以回去了吹电扇了!
来来来,开始写程序
- 首先开启一个后台服务
NetCheckService
,1分钟执行一次。记得 AndroidMenifest.xml 注册。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| /** * 检测当的网络状态 * @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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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 的。自定义短信模板还要审核,所以暂时用系统默认的。
还不完善的地方:
还有一种思路就是手机一直充着电,检测手机电池状态是否为充电。
文章来自: https://hanks.pub