4.1.3.1 Android Broadcast-Receiver的心得

Action:
android.net.conn.CONNECTIVITY_CHANGE/ConnectivityManager.CONNECTIVITY_ACTION 权限android.permission.ACCESS_NETWORK_STATE,android.permission.CHANGE_NETWORK_STATE
android.intent.action.BATTERY_CHANGED/Intent.ACTION_BATTERY_CHANGED   权限:android.permission.BATTERY_STATS
短信:android.provider.Telephony.SMS_RECEIVED 权限:android.permission.RECEIVE_SMS


 !!!注意,电池电量只能够使用动态注册,如果使用静态的就会把系统弄的太慢了。




1: 接收网络变化
2:接收电池变化
3:接收短信
4: 无序广播的发送
5:有序广播的发送
6:广播的终止




网络电话笨:如果手机当前切换wifi 电话本自动和服务器同步,静态注册;


++&~~~~~~~@#¥#%¥……%&……%………………………………………………………………………………………………………………………………
广播的说明,
广播接收者在系统中注册,
静态注册-》action-》class
动态注册-》action-》实例对象
电视的开机,静态注册
电视机开机后 选台,  动态注册,
++&~~~~~~~@#¥#%¥……%&……%………………………………………………………………………………………………………………………………


* onReceiver方法,通常运行在主线程,
     * Android 系统给这个方法一个超时时间10s,如果方法运行的时间超过10s
     * Android系统将会销毁这个广播接收者;!!!
     * 当静态注册的时候:广播接受者在执行完onRecevier 之后,立刻销毁,代表生命周期
     * 动态注册:设么时候取消注册,并置空,之后销毁。




++&~~~~~~~@#¥#%¥……%&……%………………………………………………………………………………………………………………………………




Homework:
注意    <android.support.v4.view.ViewPager
<android.support.design.widget.TabLayout
viewPager.setOffscreenPageLimit(3);
可以用来设置显示的个数,有的时候,3个fragment,但是默认的是1,所以会出现打开的时候,第三个是不onResume的,到了第三个了,这个时候第一个又不onResume。
所以可以设置为3,让他们一直onResume。






TabLayout
http://developer.android.com/reference/android/support/design/widget/TabLayout.html


在build.gradle 的dependencies 里面添加
compile 'com.android.support:design:23.1.0'
文件的位置是
C:\Android\sdk\extras\android\m2repository\com\android\support\design\23.1.0
调用的path:
android.support.design.widget.TabLayout


TabLayout tabLayout = ...;
 tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
 tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
 tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));




1:广播接收者,四大组件之一,
常见的广播:
检查到WiFi的时候,系统通知发现WwiFi是否加入
当收到短信的时候,系统发送短信收到的信息,
当手机收到电话的时候,系统发送广播,告诉应用,来电话,
当手机重新开机之后,系统会发送广播,告诉所有的应用,手机启动了。
短信的拦截。


用来接受Android 系统 或者是 应用程序 发送过来的各种广播信息。


系统、应用程序发生状态改变的时候,需要向系统统中通知其他的应用程序,进行一些操作,这个信息就是广播




2:广播接受者与哪些组件配合,
最常用的是Notifiction配合的很多很多 Notification 偏向于展示
然后就是和service 配合很多很多。 Service 偏向于无UI处理业务逻辑。


谁谁谁来信了,一个大喇叭,所有人都知道你来信了。


3:
静态注册广播接收者。
可以理解为静态变量,可以直接使用。 可以直接使用,用完生命周期就结束了,需要用的时候再直接使用。
动态注册广播接收者,可以理解为实例变量,需要对象才能调用。


静态注册广播接收者
<!--组册广播接收者:告诉系统这个接收者,关注,检测哪一种广播消息,-->
        <receiver android:name=".receivers.NetworkReceiver"
            >
            <!--使用intent filter 来告诉Android系统,这个接收者需要接受哪种广播消息-->
            <intent-filter>
                <!--设置接受者接收的消息类型action,代表intent中getAction()返回的内容-->
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>






public class NetworkReceiver extends BroadcastReceiver{
    /**
     * 广播接收者当收到广播信息(Intent数据)的时候,进行回调,大部分情况,这个方法是运行在主线程的。
     * 可以通过手动设置的形式让这个方法在子线程执行,
     * @param context
     * @param intent
     */
    @Override
    public void onReceive(Context context, Intent intent) {
        //广播中的重要数据:
        //1.ACTION-》getAction()返回当前广播的类型。!!!需要背下来,
        Log.d("NetworkReceiver", "收到广播消息" +intent );
        String action = intent.getAction();
        //2.判断广播消息的类型,使用网络变化状态为例,
        if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            ConnectivityManager connectivitManager =(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
            //如果是WIFI 就是Context.WIFI_SERVICEI
            //如果是短信Context.TELEPHONY_SERVICE
            NetworkInfo activeNetworkInfo = connectivitManager.getActiveNetworkInfo();


           String netWorkState="无网络";


            if (activeNetworkInfo != null) {
                //获取枚举类型的 网络状态
                NetworkInfo.State state = activeNetworkInfo.getState();
                Log.d("NetworkRecevier", "当前状态 " + state);
                activeNetworkInfo.getReason();
                activeNetworkInfo.getSubtype();//当前是3G,还是WiFI
                String typeName = activeNetworkInfo.getTypeName();
                int type = activeNetworkInfo.getType();
                switch (type){
                    case ConnectivityManager.TYPE_MOBILE:
                        if(state==NetworkInfo.State.CONNECTED){
                            netWorkState="切换到手机网络";
                        }
                        break;
                    case ConnectivityManager.TYPE_WIFI:
                        if(state==NetworkInfo.State.CONNECTED){
                            netWorkState="切换到wifi网络";
                        }
                        break;
                    default:
                        if(state==NetworkInfo.State.CONNECTED){
                            netWorkState="切换到其他网络";
                        }
                        break;
                }
                Log.d("NetworkRecevier", "TypeName"+typeName );


                int subtype = activeNetworkInfo.getSubtype();
                switch (subtype){
                    case ConnectivityManager.TYPE_MOBILE_DUN:
                        break;
                }


                String subTypeName = activeNetworkInfo.getSubtypeName();


                Log.d("NetworkRecevier", "subTypeName"+subTypeName );
            }else{
                Log.d("NetworkRecevier", "已经断线");
            }
            sendNotification(context,"网络变化 ",netWorkState);
        }
    }


    /**
     * 发送通知消息
     * @param context
     * @param content
     */
    public static void sendNotification(Context context,String title,String content){
        //1.
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder.setSmallIcon(R.mipmap.ic_launcher).setContentTitle(title).setContentText(content);
        Notification n = builder.build();
        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        managerCompat.notify(188,n);
    }
}


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


电池充电的广播接收,只能通过动态注册,不能通过静态注册:
public class MainActivity extends AppCompatActivity {
    private BatteryReceiver batteryReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        batteryReceiver = new BatteryReceiver();
    }


    @Override
    protected void onResume() {
        super.onResume();
//1.创建IntentFilter,对应<intent-filter><action/>
        //直接指定
        IntentFilter  intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
//2.动态注册Context对象registerReceiver
        //!!!哪个Context注册,那么,这个Receiver作用范围
        registerReceiver(batteryReceiver, intentFilter);
    }


    @Override
    protected void onPause() {
        super.onPause();
//onPause 里面一定要取消注册:不然在退出的时候会报错:
        unregisterReceiver(batteryReceiver);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        batteryReceiver=null;
    }
}


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++




package com.kodulf.broadcastrecevierdemo.receivers;


/**
 * Created by Administrator on 15-12-15.
 */


import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.BatteryManager;
import android.util.Log;


/**
 * 动态注册的案例,
 * 使用电池电量检测;
 * !!!注意,电池电量只能够使用动态注册,如果使用静态的就会把系统弄的太慢了。
 */
public class BatteryRecevier extends BroadcastReceiver {
    private String TAG="BatteryRecevier";
    @Override
    public void onReceive(Context context, Intent intent) {
        //1,定义action 内容,也就是电池变化的ACTION
        String action = intent.getAction();
        //电池电量变化,是Android 基本的状态,所以定义在Intent 中
        //包含一个ACTION
        if(action.equals(Intent.ACTION_BATTERY_CHANGED)){
        //2.获取电量相关信息
            //标准的广播信息,都存储在Intent 参数中,
            //通过BatteryManager来获取;内部包含了常量定义


            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE,0);
            int health = intent.getIntExtra(BatteryManager.EXTRA_HEALTH,0);
            int state = intent.getIntExtra(BatteryManager.EXTRA_STATUS,0);
            int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,0);


            Log.d("TAG","level "+level);
            Log.d("TAG","scale "+scale);
            Log.d("TAG","health "+health);
            Log.d("TAG","state "+state);
            Log.d("TAG","plugged "+plugged);


            //检测是否街上电源了
            switch(plugged){
                case BatteryManager.BATTERY_PLUGGED_AC:
                    //接上电源插座,交流电
                    break;
                case BatteryManager.BATTERY_PLUGGED_USB:
                    //接上电脑USB充电
                    break;
                case BatteryManager.BATTERY_PLUGGED_WIRELESS:
                    //无线充电
                    break;
            }


            //----------------------------------
            //检测status
            switch(state){
                case BatteryManager.BATTERY_STATUS_CHARGING:
                    //充电中
                    break;
                case BatteryManager.BATTERY_STATUS_DISCHARGING:
                    //耗电
                    break;
                case BatteryManager.BATTERY_STATUS_FULL:
                    //充满电
                    break;
            }
        }
    }
}


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


接收短信:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值