利用 Android 手机打造来电通知计划

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

利用现用资源:一台退休的手机
大概思路是这样的:家里的路由器是一直连着电源的,老手机是一直开着 wifi 的,来电后路由器通电,自动连接上网络,这个时候手机也检测到网络,连接上了 wifi,然后后台程序通过此判断来电了,再让老手机给我发短信通知,收到来电通知后我就可以回去了吹电扇了!

来来来,开始写程序

  1. 首先开启一个后台服务 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
/**
* 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. 检测网络
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. 判断是否来电了, 记得注册相应的权限
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
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 的。自定义短信模板还要审核,所以暂时用系统默认的。

收到短信

还不完善的地方:

  • 手机服务很有可能被杀死。
  • 短信模板。

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

文章来自: https://hanks.pub