(一)需求描述:
公司馬上要實行釘釘考勤,並且只有連接到公司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程序中需要打開自啓動權限,將系統喚醒和允許其他應用喚醒設置爲開啓狀態 如果手機開啓後處於鎖屏狀態不能實現打卡,則需要關閉鎖屏,讓手機開機後直接進入系統主頁
親測小米可用