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,
但是我们在开发的时候基本都是使用的无序广播
发送广播:
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
作者:南城阿宇