4大组件

本文介绍如何在Android中使用BroadcastReceiver来监听网络变化,并通过AlarmManager实现后台定时任务。包括注册广播、发送本地广播及利用服务执行定时操作等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BroadcastReceiver

可以注册广播来监听网络变化,主要用的是BroadcastReceiver来监听系统的消息。
网络状态变化的Action是”android.net.conn.CONNECTIVITY_CHANGE”
需要权限:
需要用到ConnectivityManager类来得到网络信息类NetworkInfo,然后可以networkInfo.isAvailable();判断网络。

public class MainActivity extends Activity {
    private MyBroadcastReceiver myBroadcastReceiver;
    private IntentFilter intentFilter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        intentFilter=new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        myBroadcastReceiver=new MyBroadcastReceiver();
        registerReceiver(myBroadcastReceiver, intentFilter);
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        unregisterReceiver(myBroadcastReceiver);
    }
    private class MyBroadcastReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
            if(networkInfo.isAvailable()&&networkInfo!=null){
                Toast.makeText(getApplicationContext(), "有网络", 0).show();
            }else{
                Toast.makeText(getApplicationContext(), "没有网络", 0).show();
            }
        }

    }
}

广播是可以跨进程的,只要监听广播的Action就可以接收到。
sendOrderdBroadcast(intent,null)可以发送有序广播,设置广播的priority可以设置广播的优先级,按照优先级发送广播。
abortBroadcast()可以拦截广播。

本地广播
由于安全性的问题,如果想要只在本应用中使用广播,可以使用LocalBroadcastManager发送本地广播。
本地广播是无法静态注册的,不可以在清单文件中注册。

public class MainActivity extends Activity {
    private Button btn;
    private LocalBroadcastManager localBroadcastManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        btn=(Button) findViewById(R.id.btn);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent=new Intent();
                intent.setAction("com.example.mybroadcastrecevierdemo.guangbo");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("com.example.mybroadcastrecevierdemo.guangbo");
        MyBroadcastReceiver broadcastReceiver=new MyBroadcastReceiver();
        localBroadcastManager.registerReceiver(broadcastReceiver,intentFilter);
    }

    private  class MyBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "收到广播", 0).show();
        }
    }
}

Service

如果想要启动一个服务来执行一些耗时操作,执行完关闭服务。
那么可以在自定义的Service的onStartCommand()方法中执行,这个方法在Service的onCreate()创建之后就会执行。
在onStartCommand()中开启一个子线程(因为Service也是运行在主线程中的,耗时操作要放在子线程),然后在run(){}方法执行的最后,stopSelf()就可以在子线程结束后关闭服务。

后台定时任务
//总体来说就是Activity中开启服务,服务定义定时器任务并执行,而且隔一段时间去通知广播接收者,让广播接收者再去开始服务,这样循环就完成了一个后台的定时任务。
//首先在Activity中开启了服务

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent=new Intent(this,MySerive.class);
        startService(intent);
    }
}

//然后在服务中定义一个定时器AlarmManager 执行任务;定义好一个固定时间;然后用Intent,PendingIntent去包装一个广播接收者,最后让AlarmManager根据定时器的模式,时间,和Pending去设置这个定时器任务。

public class MySerive extends Service {
    private static final String TIME="TIME";
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    //从onStartCommand方法开始,也就是启动服务之后,就开始执行此任务,这里选择的是
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(new Runnable() {

            @Override
            public void run() {
                Log.d("TIME", "定时任务在执行..");
            }
        }).start();
        //定义一个警报管理者,可以进行定时任务。
        AlarmManager alarmManager=(AlarmManager) getSystemService(Context.ALARM_SERVICE);
        long time=SystemClock.elapsedRealtime()+1000*10;
        //指向广播接受者的intent
        Intent receiverIntent=new Intent(this,MyBroadcastReceiver.class);
        //封装了广播接受者的PendingIntent。
        PendingIntent pendingIntent=PendingIntent.getBroadcast(this, 0, receiverIntent, 0);
        //第一个参数是模式,
            //AlarmManager.ELAPSED_REALTIME_WAKEUP:定时任务从开机的时间计算,并且会唤醒CPU。
            //AlarmManager.ELAPSED_REALTIME       :定时任务从开机的时间计算,不会唤醒CPU。
            //AlarmManager.RTC_WAKEUP:表示从1970年1月1日0点开始计算时间的毫秒数,并且会唤醒CPU。
            //AlarmManager.RTC        :表示从1970年1月1日0点开始计算时间的毫秒数,不会唤醒CPU。
        //第二个参数是间隔时间。
        //第三个参数是可以执行广播的PesndingIntent。
        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, time, pendingIntent);
        return super.onStartCommand(intent, flags, startId);
    }
}

//这个广播接收者去开启服务

public class MyBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent=new Intent(context,MySerive.class);
        context.startService(serviceIntent);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值