(一)需求描述:
公司马上要实行钉钉考勤,并且只有连接到公司wifi才能进行打卡,可是我公司在30楼,就算你现在楼下排队等电梯还是不能打卡,还是避免不了迟到真是坑爹;我发现我每次打开钉钉它会自动帮我极速打卡,于是我脑子浮现出一种想法,我每天早上在上班时间之前启动一次钉钉不就可以自动打卡了,于是乎我做了一个app通过这个app来启动钉钉。就这样我准备了一台公司的测试机,设置每天开关机时间,它就工作起来了
(二)主要思路:
1.因为我的app不会一直存在,很大可能被杀死,让我的app定时开启钉钉APP是不靠谱的
2.我想到了系统广播,当我的APP接收到了系统广播后(这里我使用的是手机开机广播,当手机开机后,网络状态恢复稳定后,就会启动钉钉),通过代码去启动钉钉APP
3.因为公司开通了极速打卡功能,打开钉钉后会自动打卡(没有这个功能则不能实现打卡)
(三)代码实现
监听手机开机状态
package com.spring.autocheckingindemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
/**
* Created by Administrator on 2018/7/27.
* 当手机开机时接收广播监听
* 开机后自动开启自己的应用
*/
public class BootBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"自启动程序即将执行",Toast.LENGTH_SHORT).show();
//MainActivity就是开机显示的界面
Intent mBootIntent = new Intent(context, MainActivity.class);
//下面这句话必须加上才能开机自动运行app的界面
mBootIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mBootIntent);
}
}
AndroidManifest.xml中注册
<receiver android:name=".BootBroadcastReceiver">
<intent-filter>
<!--注册开机广播地址-->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
MainActivity的代码
其中注册了网络监听,目的是在网络可使用的状态下启动钉钉,避免网络的原因导致打卡失败
package com.spring.autocheckingindemo;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private NetBroadcastReceiver netBroadcastReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注册网络监听
netBroadcastReceiver = new NetBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
filter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
filter.addAction("android.net.wifi.STATE_CHANGE");
registerReceiver(netBroadcastReceiver, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(netBroadcastReceiver);
}
}
网络监听代码如下:
package com.spring.autocheckingindemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
/**
* Created by Administrator on 2018/7/27.
* 网络广播监听
*/
public class NetBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "NetBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent) {
// 这个监听网络连接的设置,包括wifi和移动数据的打开和关闭。.
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
ConnectivityManager manager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = manager.getActiveNetworkInfo();
if (activeNetwork != null) { // connected to the internet
if (activeNetwork.isConnected()) {
if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) {
Log.e(TAG, "当前WiFi连接可用 ");
//启动钉钉已实现自动打卡
startOtherApp(context,"com.alibaba.android.rimet");
} else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) {
Log.e(TAG, "当前移动网络连接可用 ");
}
} else {
Log.e(TAG, "当前没有网络连接,请确保你已经打开网络 ");
}
} else { // not connected to the internet
Log.e(TAG, "当前没有网络连接,请确保你已经打开网络 ");
}
}
}
/**
* 启动其他app应用
* @param context
* @param packageName 应用包名
*/
public void startOtherApp(Context context,String packageName) {
PackageManager packageManager = context.getPackageManager();
Intent launchIntentForPackage = packageManager.getLaunchIntentForPackage(packageName);
if (launchIntentForPackage != null) {
context.startActivity(launchIntentForPackage);
} else {
Toast.makeText(context, "手机未安装该应用", Toast.LENGTH_SHORT).show();
}
}
}
配置文件中添加相关权限
<!--允许读取网络状态-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--允许读取wifi网络状态-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
github代码链接地址https://github.com/qidingquan/AutoCheckingInDemo.git
注意事项: 在app程序中需要打开自启动权限,将系统唤醒和允许其他应用唤醒设置为开启状态 如果手机开启后处于锁屏状态不能实现打卡,则需要关闭锁屏,让手机开机后直接进入系统主页
亲测小米可用