Log用法:logt定义静态常量activity;loge快捷键直接开搞
Toast的基本用法:Toast.makeText(MainActivity.this,"Add",Toast.LENGTH_SHORT).show();
Menu用法:右键res文件创建Directory文件(menu),menu下创建xml文件
<item android:title="Add"
android:id="@+id/add_item"/>
接着在activity里重写onOptionsItemSelected、nCreateOptionsMenu方法
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.add_item:
Toast.makeText(MainActivity.this,"Add",Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(MainActivity.this,"Remove",Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
Intent实现活动穿梭
显式Intent:设置OnClick点击事件:
edit_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(EditActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
隐式Intent:
打开网页:
Intent intent =new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
拨打电话:
Intent intent =new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
向下一个活动传递数据:
Activity1:
String data = "hello world!";
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
Activity2:
Intent intent =getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
返回数据给上一个活动:
Activity1:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent ,1);
重写onActivityResult方法,三个参数分别是,请求码(就是上面的1),第二个是处理结果,第三个是返回数据的Intent
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
switch (requestCode){
case 1:
if (resultCode == RESULT_OK){
String returnData = data.getStringExtra("data_return");
Log.d("MainActivity",returnData);
}
break;
default:
}
}
Activity2:
setResult作用是专门想上一个活动返回数据;finish直接销毁活动。
Button button = findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return","Hello World!");
setResult(RESULT_OK,intent);
finish();
}
});
如果直接想在Activity2里用back键操作的话,则在Activity2里重写onBackPressed方法就好了,直接代替button点击事件。
活
活动生命周期
android用栈管理活动,当用户点击back键或者调用finish()函数时,活动被销毁。
活动状态:
- 运行状态:当活动处于栈顶时,活动为运行状态,系统非常不愿洗回收它来扩充内存。
- 暂停状态:活动不再处于栈顶位置但依然可见,如对话框形式的活动,称之为暂停状态,系统也非常不愿意回收这样的活动。
- 停止状态:当活动变得既不可见,又被从栈顶移除时,就成了停止状态,系统很容易回首这样的活动,如hupu的后台运行。
- 销毁状态:当活动从返回栈移除后就成了销毁状态,系统非常愿意回收这样的活动,直接从后台移除程序。
活动的生存期:7个回调方法覆盖了活动生命周期的每一个环节。
- onCreate():在活动第一次被创建时调用时需要重写此方法,完成初始化操作,比如加载布局,绑定事件。
- onStart():在活动由不可见变为可见时调用。
- onResume():在活动准备好与用户交互时调用,此事活动一定处于运行状态(栈顶)。
- onPause():在系统准备启动或者恢复另一个活动时调用,但速度要快(???),不然影响新的栈顶活动。
- onStop():在活动变为完全不可见时调用,与onPause()的区别在于,如果启动的活动更是对话框的活动,则onPause()会被调用,而onStop()不会。
- onDestroy():在活动被销毁前调用,之后活动变为销毁状态。
- onRestart():活动由停止状态变为运行状态时调用,也就是活动被重新启动了。
活动的生存期:除了onRestart()之外的六个活动是两两相对的,分成三个生存期:
- 完整生存期:活动在onCreate()和onDestroy()之间所经历就是完整生存期。onCreate()中进行各种初始化工作,onDestroy()中完成释放内存的操作。
- 可见生存期:onStart()和onStop()之间所经历的的,就是可见生存期,在此时期内,活动对于用户总是可见的(即使无法交互),我们可以在onStart()中加载资源,在onStop()释放资源,从而保证停止的活动不会占用太多内存。
- 前台生存期:onResume()和onPause()之间就是前台生存期,在此期间内,活动总处于运行状态,活动能和用户交互,一般来说我们接触到最多的也是此期间内的活动。
onSaveInstanceState()在onPause()或onStop()之前执行:可以解决返回主活动时数据丢失的情况。
MainActivity里重写onSaveInstanceState方法:
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "hello world!";
outState.putString("data_key",tempData);
}
MainActivity里的onCreate( savedInstanceState)调用
if (savedInstanceState != null){
String tempData = savedInstanceState.getString("data_key");
}
活动的启动方式:
活动的启动方式可以在AndroidManifest.xml中的< activity>标签中指定android:launchMode属性(< intent-filter>标签外边)
standard:
活动默认的启动f方式,在此模式下,每当启动一个新的活动,就会在返回栈中入栈,且处于栈顶,而且系统不在乎你返回栈中是否有这个活动,每次启动都会创建该活动的一个新的实例。如图,返回栈中有三个Activity实例:
singleTop:
在此模式下,如果启动活动时发现返回栈的栈顶已经是该活动,则认为可以直接使用他,不会在创建新的活动实例。如果活动不是处于栈顶位置,则启动活动时还是会创建新的活动实例了,如图所示:
singleTask:
在此模式下,每次启动该活动时系统都会在返回栈中检查是否存在该活动,如果存在就直接使用该活动实例,还会把此活动之上的活动统统出栈,使此活动处于栈顶位置(先onRestart新活动,再把他前面(栈里)的出栈);如果没有发现就会创造一个新的实例:
singleInstance:
这个启动模式是4个里面最复杂的一个:他会启动一个新的返回栈来管理此活动。试用情景,允许其他程序调用此程序中的活动,而在此模式下系统会创建一个公共的返回栈,不管那个应用程序访问此活动,都会公用这个新建的返回栈,如图所示:
活动的最佳实践
知晓当前是哪一个活动:
创建一个新的普通的Java类,名为BaseActivity,让他继承AppCompatActivity:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("BaseActivity", getClass().getSimpleName());
}
}
让他变成所有活动的父类,就让所有活动继承它就完了,他又继承AppCompatActivity,所以项目中互动的功能完全不受印象,点击运行,打开哪个活动看日志就可以了。
随时随地退出程序:
首先建一个ActivityCollector类(普通的Java类)作为活动管理器,建一个List来暂存活动,创建addActivity方法来添加活动,创建removeActivity来从List中移除活动,最后创建一个finishAll()方法来销毁List当中的所有活动:
public class ActivityCollector {
public static List<Activity>activities = new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for (Activity activity:activities){
if (!activity.isFinishing()){
activity.finish();
}
}
activities.clear();
}
}
修改BaseActivity中代码:
public class BaseActivity extends AppCompatActivity {
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
onCreate()中调用ActivityCollector()的addActivity()方法,重写onDestroy()方法调用ActivityCollector()的RemoveActivity()方法,将一个马上要销毁的活动在活动管理器中移除出去。
如果你想在任何地方退出程序,直接调用ActivityCollector中的finishAll()方法就可以了,设置一个button点击事件,ActivityCollector.finishAll()。
杀掉进程代码:略。
启动活动的最佳写法:
添加一个actionStart()方法:
传入要传入的参数,这里假设是两个字符串参数data1,data2。
public static void actionStart(Context context,String data1,String data2){
Intent intent = new Intent(context,SecondActivity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
context.startActivity(intent);
}
所有SecondActivity中的参数都是通过actionStart()方法体现出来了,这样就能一目了然SecondActivity所需要的所有参数,只许要一行代码(button点击事件)就可以启动SecondActivity:
SecondActivity.actionStart(FirstActivity.this,"data1","data2");