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

  • 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:

扫描二维码关注公众号,回复: 10687532 查看本文章
实现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方式:

  • 布局添加
<fragment
        android:id="@+id/fragment1"
        android:name="com.swjd.mytest10.Fragement1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />
    <fragment
        android:id="@+id/fragment2"
        android:name="com.swjd.mytest10.Fragement2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

  • 代码添加
注意用此种方式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); 
    }    
}
在清单文件中注册:
   <receiver android:name=".Receiver">
      <intent-filter>
          <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
          <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
      </intent-filter>
</receiver>

  • 动态注册
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中声明

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

  2. 使用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

发布了14 篇原创文章 · 获赞 11 · 访问量 1300

猜你喜欢

转载自blog.csdn.net/qq_44534541/article/details/105426890