手機系統廣播監聽和啓動第三方程序應用

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

親測小米可用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章