(一)需求描述:
公司马上要实行钉钉考勤,并且只有连接到公司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程序中需要打开自启动权限,将系统唤醒和允许其他应用唤醒设置为开启状态 如果手机开启后处于锁屏状态不能实现打卡,则需要关闭锁屏,让手机开机后直接进入系统主页

亲测小米可用