1.Activity生命周期:
onCreate()> onStart() > onResume() > onPause() > onStop() > ( onRestart() ) > onDestroy()
2.Activity跳转及数据传递:
//显式跳转1
Intent intent = new Intent(AActivity.this,BActivity.class);
startActivity(intent);
//显式2
Intent intent = new Intent();
intent.setClass(AActivity.this,BActivity.class);
startActivity(intent);
//显式3
Intent intent = new Intent();
intent.setClassName(AActivity.this,"com.example.learnandroidfrominternet.jump.BActivity");
startActivity(intent);
//显式4
Intent intent = new Intent();
intent.setComponent(new ComponentName(AActivity.this,"com.example.learnandroidfrominternet.jump.BActivity"));
startActivity(intent);
//隐式
Intent intent = new Intent();
intent.setAction("AActivityToBActivity");//在要跳转的activity的xml配置下
startActivity(intent);
//Mainfest.xml配置
<intent-filter>
<action android:name="AActivityToBActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
//数据传递
Intent intent = new Intent(AActivity.this,BActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name","name");
bundle.putInt("number",66);
intent.putExtras(bundle);
//startActivity(intent);
startActivityForResult(intent,0);//此方法可接收跳转的activity返回当前activity的回传数据,0为请求码,用于判断是谁发起的
//目标activity接收数据
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
int number = bundle.getInt("number");
title.setText("name:"+name+" number:"+number);
//目标activity结束当前activity,返回前一个activity,回传数据
Intent intent = new Intent();
Bundle bundle1 = new Bundle();
bundle1.putString("title","我回来了");
intent.putExtras(bundle1);
setResult(Activity.RESULT_OK,intent);
finish();
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
ToastUtil.showMsg(this,data.getExtras().getString("title")+"---"+requestCode+"---"+resultCode);
}
Activity四种启动方式:
- standard:标准,没启动一个activity就入栈。
- singleTop:如果activity已经在栈中存在,且在栈顶,则不创建新的实例,直接复用。
- singleTask: 如果栈中存在activity,则复用,但会移除上面的activity。
- singleInstance:全局,一个activity实例就是一个栈(例如,支付宝)
3.Fragment
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--<Button
android:id="@+id/btn_change"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="更换fragment"
android:textAllCaps="false"/>-->
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorBlack"
android:textSize="20sp"
android:text="Hello"/>
<FrameLayout
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tv_title"/>
</RelativeLayout>
ContainerActivity:
public class ContainerActivity extends AppCompatActivity implements AFragment.IOnMessageClick {
private AFragment aFragment;
private BFragment bFragment;
private Button btn_change;
private TextView title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_container);
// btn_change = findViewById(R.id.btn_change);
title = findViewById(R.id.tv_title);
aFragment = AFragment.newInstance("我是参数");
getSupportFragmentManager().beginTransaction().add(R.id.fl_container,aFragment,"afragment").commitAllowingStateLoss();
/* btn_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(bFragment == null){
bFragment = new BFragment();
}
getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,bFragment).commitAllowingStateLoss();
}
});*/
}
public void setData(String text){
title.setText(text);
}
@Override
public void onClick(String text) {
title.setText(text);
}
}
AFragment:
public class AFragment extends Fragment {
private TextView title;
private Button btn_change,btn_reset,btn_message;
private BFragment bFragment;
private IOnMessageClick listener;
// private Activity activity;
public static AFragment newInstance(String title){
AFragment aFragment = new AFragment();
Bundle bundle = new Bundle();
bundle.putString("title",title);
aFragment.setArguments(bundle);
return aFragment;
}
public interface IOnMessageClick{
void onClick(String text);
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_a,container,false);
Log.d("AFragment","----onCreateView----");
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
title = view.findViewById(R.id.tv_title);
btn_change = view.findViewById(R.id.btn_change);
btn_reset = view.findViewById(R.id.btn_reset);
btn_message = view.findViewById(R.id.btn_message);
btn_message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// ((ContainerActivity)getActivity()).setData("你好");
listener.onClick("你好");
}
});
btn_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(bFragment == null){
bFragment = new BFragment();
}
Fragment fragment = getActivity().getSupportFragmentManager().findFragmentByTag("afragment");
if(fragment != null){
getActivity().getSupportFragmentManager().beginTransaction().hide(fragment).add(R.id.fl_container,bFragment).addToBackStack(null).commitAllowingStateLoss();
}else {
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fl_container, bFragment).addToBackStack(null).commitAllowingStateLoss();
}
}
});
btn_reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
title.setText("我是新文字");
}
});
if(getArguments() != null){
title.setText(getArguments().getString("title"));
}
/*if(getActivity()!=null){
}else{
}*/
}
//当fragment与activity绑定后就会调用该方法
@Override
public void onAttach(Context context) {
super.onAttach(context);
// activity = (Activity) context;
try {
listener = (IOnMessageClick) context;
}catch (ClassCastException e){
throw new ClassCastException("Activity 必须实现 IOnMessageClick接口");
}
}
@Override
public void onDetach() {
super.onDetach();
}
}
fragment_a.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<Button
android:id="@+id/btn_message"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="给Activity传递消息"
android:textAllCaps="false"/>
<Button
android:id="@+id/btn_change"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="更换为Bfragment"
android:textAllCaps="false"/>
<Button
android:id="@+id/btn_reset"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="更换textview的文字内容"
android:textAllCaps="false"/>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="20sp"
android:gravity="center"
android:textColor="@color/colorBlack"
android:text="fragmentA"/>
</LinearLayout>
4.Event
点击事件5种:
- 内部类;
- 匿名内部类;
- 通过事件源所在的类实现;
- 通过外部类实现;
- 布局文件引用。
引用顺序:布局文件定义的优先级最低,最后一个定义的优先级最高
按钮的touch事件顺序:
dispatchTouchEvent > Listener >onTouchEvent
5.Handler线程通信:
public class HandlerActivity extends AppCompatActivity {
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
/*handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(HandlerActivity.this,ButtonActivity.class);
startActivity(intent);
}
}, 3000);*/
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
ToastUtil.showMsg(HandlerActivity.this,"线程通信成功");
break;
}
}
};
new Thread(){
@Override
public void run() {
super.run();
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}.start();
}
}