Androidグローバル傍受システム放送

9808 ワード

アンドロイドに従事して2年余りになりましたが、放送に対する認識は非常に少なく、普段放送で最も多く使われているのは傍受システムのネットワークの変化で、私は本文の中で主に自分の放送応用に対する思想を説明しています.放送に慣れていない方は以下のチェーンを参考にしてくださいhttp://www.cnblogs.com/trinea/archive/2012/11/09/2763182.html 次に,ネットワーク傍受を例に説明する.
1、カスタム放送
ここでonReceiveでコールバック処理を行い,NetworkCallbackで登録傍受のページにコールバックする.ANDROID_NET_CHANGE_ACTION:IntentFilterのaction ObjectsHolderをブロードキャストする:内部用ArrayListで実現されるマルチオブジェクト保有管理クラス(詳細は下記参照)
public class NetworkReceiver extends BroadcastReceiver
{

    private final static String ANDROID_NET_CHANGE_ACTION = "com.king.CONNECTIVITY_CHANGE";
    private static BroadcastReceiver sReceiver;
    private static IObjectsHolder sObjectsHolder = new ObjectsHolder<>();

    @Override
    public void onReceive(Context context, Intent intent)
    {
        sReceiver = this;
        String action = intent.getAction();
        if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action) || ANDROID_NET_CHANGE_ACTION.equals(action))
        {
            final NetworkType type = getNetworkType(context);

            sObjectsHolder.foreach(new IterateCallback()
            {
                @Override
                public boolean next(int i, NetworkCallback item, Iterator it)
                {
                    item.onNetworkChanged(type);
                    return false;
                }
            });

        }

    }


    public static BroadcastReceiver getReceiver()
    {
        if (sReceiver == null)
        {
            sReceiver = new NetworkReceiver();
        }
        return sReceiver;
    }


    /**
     *         
     *
     * @param context
     */
    public static void sendBroadcast(Context context)
    {
        Intent intent = new Intent();
        intent.setAction(ANDROID_NET_CHANGE_ACTION);
        context.sendBroadcast(intent);
    }

    /**
     *     
     *
     * @param context
     */
    public static void registerReceiver(Context context)
    {
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        filter.addAction(ANDROID_NET_CHANGE_ACTION);
        context.getApplicationContext().registerReceiver(getReceiver(), filter);
    }


    /**
     *       
     *
     * @param context
     */
    public static void unregisterReceiver(Context context)
    {
        if (sReceiver != null)
        {
            try
            {
                context.getApplicationContext().unregisterReceiver(sReceiver);
            } catch (Exception e)
            {
            }
        }
    }


    /**
     *     
     *
     * @param callback
     */
    public static void addCallback(NetworkCallback callback)
    {
        sObjectsHolder.add(callback);
    }

    /**
     *     
     *
     * @param callback
     */
    public static void removeCallback(NetworkCallback callback)
    {
        sObjectsHolder.remove(callback);
    }

    /**
     *   ConnectivityManager  
     *
     * @param context
     * @return
     */
    public static ConnectivityManager getConnectivityManager(Context context)
    {
        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        return manager;
    }

    /**
     *       
     *
     * @param context
     * @return
     */
    public static boolean isNetworkConnected(Context context)
    {
        ConnectivityManager manager = getConnectivityManager(context);
        NetworkInfo info = manager.getActiveNetworkInfo();
        if (info != null)
        {
            return info.isConnected();
        } else
        {
            return false;
        }
    }

    /**
     * wifi    
     *
     * @param context
     * @return
     */
    public static boolean isWifiConnected(Context context)
    {
        ConnectivityManager manager = getConnectivityManager(context);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        if (networkInfo == null)
        {
            return false;
        } else
        {
            return ConnectivityManager.TYPE_WIFI == networkInfo.getType();
        }
    }


    /**
     *       
     *
     * @param context
     * @return
     */
    public static NetworkType getNetworkType(Context context)
    {
        ConnectivityManager manager = getConnectivityManager(context);
        NetworkInfo networkInfo = manager.getActiveNetworkInfo();
        if (networkInfo == null)
        {
            return NetworkType.None;
        } else
        {
            int type = networkInfo.getType();
            if (type == ConnectivityManager.TYPE_MOBILE)
            {
                return NetworkType.Mobile;
            } else if (type == ConnectivityManager.TYPE_WIFI)
            {
                return NetworkType.Wifi;
            } else
            {
                return NetworkType.None;
            }
        }
    }


    public enum NetworkType
    {
        /**
         * wifi  
         */
        Wifi,
        /**
         *       
         */
        Mobile,
        /**
         *    
         */
        None
    }

    public interface NetworkCallback
    {
        /**
         *       
         *
         * @param type
         */
        void onNetworkChanged(NetworkType type);
    }

}

2、インタフェースとObjectsHolderクラスの作成
内部にArrayListで実装されたマルチオブジェクト保有管理クラス
public interface IObjectsHolder
{

    /**
     * @Description     
     * @param object
     */
    void add(T object);

    /**
     * @Description     
     * @param object
     */
    boolean remove(T object);

    /**
     *
     * @Description           
     * @param object
     */
    boolean contains(T object);

    /**
     * @Description     
     */
    int size();

    /**
     * @Description     
     */
    void clear();

    /**
     * @Description     
     */

    boolean foreach(IterateCallback callback);


    /**
     * @Description       
     */
    boolean foreachReverse(IterateCallback callback);

}
public class ObjectsHolder implements IObjectsHolder
{
    private List mListObject = new ArrayList<>();

    @Override
    public void add(T object)
    {
        if (object == null)
        {
            return;
        }
        if (!mListObject.contains(object))
        {
            mListObject.add(object);
        }
    }

    @Override
    public boolean remove(T object)
    {
        if (object == null)
        {
            return false;
        }
        return mListObject.remove(object);
    }

    @Override
    public boolean contains(T object)
    {
        if (object == null)
        {
            return false;
        }
        return mListObject.contains(object);
    }

    @Override
    public int size()
    {
        return mListObject.size();
    }

    @Override
    public void clear()
    {
        mListObject.clear();
    }

    @Override
    public boolean foreach(IterateCallback callback)
    {
        return CollectionUtil.foreach(mListObject,callback);
    }

    @Override
    public boolean foreachReverse(IterateCallback callback)
    {
        return CollectionUtil.foreachReverse(mListObject,callback);
    }
}

3、プログラムの入り口で登録する
public class App extends Application
{
    private static App sInstance;

    public static App getApplication()
    {
        return sInstance;
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
        sInstance = this;
        init();
    }

    private void init()
    {
        NetworkReceiver.registerReceiver(this);
    }


    @Override
    public void onTerminate()
    {
        NetworkReceiver.unregisterReceiver(this);
        super.onTerminate();
    }
}

4、BaseActivityでインタフェースを実現し、サブクラスへの呼び出し方法を提供する
public class BaseActivity extends AppCompatActivity implements NetworkReceiver.NetworkCallback
{

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        init();
    }

    private void init()
    {
        NetworkReceiver.addCallback(this);
    }

    @Override
    protected void onDestroy()
    {
        NetworkReceiver.removeCallback(this);
        super.onDestroy();
    }

    @Override
    public void onNetworkChanged(NetworkReceiver.NetworkType type)
    {

    }

public class MainActivity extends BaseActivity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onNetworkChanged(NetworkReceiver.NetworkType type)
    {
        //          SIM ,         mobil
        if (type == NetworkReceiver.NetworkType.Wifi)
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("         ,       ,    ?");
            builder.setCancelable(false);
            builder.setNegativeButton("  ", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {

                }
            });
            builder.setPositiveButton("  ", new DialogInterface.OnClickListener()
            {
                @Override
                public void onClick(DialogInterface dialog, int which)
                {

                }
            });
            builder.show();
        }
        super.onNetworkChanged(type);
    }
}

具体的なdemoはhttps://github.com/BingoKingCoding/NetworkMonitor. 応援ありがとうございます.