文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

安卓开发---05 Android常用的组件与消息

2022-06-06 13:51

关注

Handler、Message Intent意图 Fragment、 Context Activity Application、 Broadcast Receive Service

1.Handler 、 looper 、 MessageQueue 、 Message

handler是用来接收和处理线程的消息队列里的message/runnable对象的工具。每个handler实例关联一个单独的线程和这个的线程的消息队列,handler实例会绑定到创建这个handler的线程。从那一刻起,handler会发送message/runnable到消息队列,然后在message/runnable从消息队列出来的时候处理它。
用法:处理线程之间消息的传递。

考虑到java多线程的线程安全问题,android规定只能在UI线程修改Activity中的UI。为了在其他线程中可以修改UI,所以引入Handler,从其他线程传消息到UI线程,然后UI线程接受到消息时更新线程。

1、Message msg=Message.obtain();
                msg.what=1;
                msg.arg1=1;
                handler.sendMessage(msg);
2、handler.postDelayed

2.Intent 意图

Intent是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由 Intent来协助完成 Android各个组件之间的通讯。比如说调用startActivity()来启动一个Activity,或者由broadcaseIntent()来传递给所有感兴趣的BroadcaseReceiver,再或者由startService() / bindservice()来启动一个后台的 service。所以可以看出来,Intent 主要是用来启动其他的 activity 或者 service,所以可以将 intent 理解成 activity 之间的粘合剂。

启动activity

Intent intent = new Intent(this, SecondActivity.class);  
startActivity(intent);

带数据的启动:

Intent intent=new Intent(MainActivity.this,Main2Activity.class);
intent.putExtra("name","Liming");  //设置intent 的信息的传递
startActivity(intent);

在另一个activity onCreate中获取数据:

Intent intent=getIntent();  //获取intent传递
intent.getStringExtra("name");//获取值
Log.e("name",intent.getStringExtra("name")); //打印

用bundle装载数据:

Intent intent=new Intent(MainActivity.this,SecondActivity.class);
Bundle bundle = new Bundle(); 
bundle.putString("action", "1"); 
bundle.putString("name", edtName.getText().toString()); 
bundle.putString("pass", edtPass.getText().toString()); 
intent.putExtras(bundle);
startActivity(intent);

另一个activity获取数据:

Bundle bundle = getIntent().getExtras();
        String act = bundle.getString("action");
        String name = bundle.getString("name");
        String pass = bundle.getString("pass");

Activity之间传递对象1:

实现Serializable(序列化)接口
Intent i= new Intent(MainActivity.this,TheAty.class);
i.putExtra("user",new User("SWWWW",21));
startActivity(i);
另一个activity获取对象:
Intent i =getIntent();
User user= (User) i.getSerializableExtra("user");

Activity之间传递对象2:

继承Parcelable接口,同样的,先写一个User.java类
这里比较麻烦的就是必须要重写两个函数:writeToParcel和describeContents即代码的最后两个函数,第一个不需要改变,第二个则模拟了第一个方法中的读取方法,不过是我们程序员手写。但是效率高。为了代码更优,还是建议大家使用这种方法。

@Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getName());//user两个属性name和age
        dest.writeInt(getAge());
    }
最后还需要改动的一点是:
User user= (User) i.getSerializableExtra("user");
需要改为:
User user=i.getParcelableExtra("user");

3.Fragment:

Fragment是依赖于Activity的,不能独立存在的。
一个Activity里可以有多个Fragment。
一个Fragment可以被多个Activity重用。
Fragment有自己的生命周期,并能接收输入事件。
我们能在Activity运行时动态地添加或删除Fragment。
Fragment的优势有以下几点:
模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。
可重用(Reusability):多个Activity可以重用一个Fragment。
可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。

Fragment生命周期:
https://baijiahao.baidu.com/sid=1616346831006531612&wfr=spider&for=pc

onAttach() :Fragment已经关联到Activity,这个时候 Activity已经传进来了, 获得Activity的传递的值就可以进行与activity的通信, 当然也可以使用getActivity(),前提是Fragment已经和宿主Activity关联,并且没有脱离,有且只调用一次。
onCreate():初始化Fragment。可通过参数savedInstanceState获取之前保存的值。
onCreateView():初始化Fragment的布局。加载布局和findViewById的操作通常在此函数内完成,但是不建议执行耗时的操作。
onActivityCreated():执行该方法时,与Fragment绑定的Activity的onCreate方法已经执行完成并返回,在该方法内可以进行与Activity交互的UI操作,所以在该方法之前Activity的onCreate方法并未执行完成,如果提前进行交互操作,会引发空指针异常。
onStart():启动Fragement 启动时回调,,此时Fragement可见。
onResume():Fragment处于活动状态,用户可与之交互。
onPause():Fragment处于暂停状态,但依然可见,用户不能与之交互。
onStop():Fragment完全不可见。
onDestroyView():销毁与Fragment有关的视图,但未与Activity解除绑定,依然可以通过onCreateView方法重新创建视图。
onDestroy():销毁Fragment对象。
onDetach():Fragment和Activity解除关联的时候调用。

Fragment生命周期的执行情况:

Fragment onCreateView写法

View view = inflater.inflate(R.layout.frag_one,null);
        return  view;

Activity添加fragment方式:

布局添加

代码添加
注意用此种方式activity布局里面的fragment要换成FrameLayout
FragmentManager fm=getSupportFragmentManager();
fm.beginTransaction().add(R.id.fragment1, new Fragement1()).commit();
fm.beginTransaction().add(R.id.fragment2, new Fragement2()).commit();
Fragment调用activity方法:
先在activity中写方法 
再fragment onActivityCreated方法中获取activity
MainActivity activity=(MainActivity)getActivity();
再调用方法
获取控件:
getActivity().findViewById() //获取到控件

4.context、activity
context
activity

5.Application
https://blog.csdn.net/ayangann915/article/details/80601150

6.BroadcastReceive广播接收者

BroadCastReceiver是Android四大组件之一,主要用于接收系统或者app发送的广播事件

广播分两种: 有序广播无序广播
内部通信实现机制:通过Android系统的Binder机制实现通信的
无序广播:sendBroadcast()方法发送的广播为无序广播,无序广播逻辑上可以被任何广播接受者接收到,优点是效率高。缺点是一个接收者不能将处理结果传递给下一个接收者,传递的数据在传输过程中不能被修改,并无法终止广播的传播。
有序广播:sendOrderedBroadcast()方法发送的广播为有序广播,有序广播依次传播,列如有三个广播接收者A,B,C, 优先级是A>B>C,

此时发送一条广播,那这个消息先传给A,再传给B, 最后传给C,每个接收者都有权终止广播,比如B终止广播,C就无法接受到, 此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中获取A存入的数据。

但是我们在开发的时候基本都是使用的无序广播

发送广播:

Intent intent=new Intent("com.example.dimple.BROADCAST_TEST");
        sendBroadcast(intent);
或者
Intent intent=new Intent();
Intent.setAction(”xxxx”)
        sendBroadcast(intent);

广播接收者注册的两种方式:

静态注册
创建广播类:
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        System.out.println("广播接受者:"+action); 
    }    
}
在清单文件中注册:
动态注册
br=new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
  Toast.makeText(MainActivity.this,intent.getAction(),
Toast.LENGTH_SHORT).show();} };
private IntentFilter getFliter(){
        IntentFilter filter=new IntentFilter();
        filter.addAction("aaa");
        filter.addAction("bbb");
        return filter;
}
protected void onResume() {
        super.onResume();
            //注册
            registerReceiver(br , getFliter ());
    }
    @Override
    protected void onPause() {
        super.onPause();
          //注销
             unregisterReceiver(br);  }

7.Service服务
Android Service是Android四大组件之一,它主要用来执行一些不与用户交互的long-run的操作. 注意Service如非特意指定,它仅是运行于该进程的一部分代码而已,另外Service并不是运行在单独线程中,而是主线程中。所以尽量要避免一些ANR的操作
Service是Android中的四大组件,使用它一定要在AndroidManifest.xml中声明


使用startService启动服务的生命周期方法:
使用这种方法启动一个Service,在Service启动后该Service和启动该Service的Activity就没有关系了。但是这种发放启动的Service不能和Activity进行交互。
通常情况下使用startService调用的Service生命周期方法为:onCreate()->onStartCommand()。
其中多次调用startService只调用一次onCreate(), 但可以多次调用onStartCommand().
当服务需要退出时,调用stopService,就会调用Service的onDestroy()方法。

使用bindService启动服务的生命周期方法:
使用这种方法启动的Service是和调用者Activtiy同生命的,当Activtiy退出时,服务也同时销毁了。这种方法启动的Service能够和Activity进行交互。
调用bindService启动服务,Service生命周期方法为:onCreate()->onBind()
多次调用bindService并不会多次调用onBind(), 即onCreate()和onBind()都是只被调用一次。
当Activity退出是,该Service销毁,调用:onUnbind()->onDestroy();
private class MyConn implements ServiceConnection
https://blog.csdn.net/zhu576558203/article/details/79398656


作者:南城阿宇


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯