-
活动的基本操作
-
设置为主活动
<intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter>
-
使用toast(点击某个按钮后出现toast弹窗)
Button botton1=(Button) findViewById(R.id.button_1); button1=setOnClickListener(new View.OnClickListener(){ @override public void onClick(View v){ Toast.makeText(activity_name.this,"you have clicked button 1",Toast.LENGTH_SHORT).show(); } });
-
使用menu
-
在res文件夹中新建menu文件夹,在menu文件夹中添加menu resource file
-
在对应的活动中重写onCreateOptionsMenu()方法
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main,menu); return true; }
-
定义菜单响应事件,在活动中重写onOptionsItemSelected()方法
public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()) { case R.id.add_item: Toast.makeText(this,"you have clicked add function",Toast.LENGTH_SHORT).show(); break; case R.id.remove_item: Toast.makeText(this,"you have clicked remove_function",Toast.LENGTH_LONG).show(); break; default; } return true; }
-
-
销毁活动
-
-
多个活动:使用intent在活动之间穿梭,可以实现多个程序之间的功能共享
-
启动一个活动:intent:安卓程序中各组件之间进行交互的一种重要方式,一般可被用于启动活动、启动服务以及发送广播等场景
-
显式intent:直接在intent构造函数的参数中指定启动的活动
- 设置intent构造函数的参数(即“意图”)
- 将构建好的intent传入特定的activity类
Intent intent=new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent);
-
隐式intent:指定action和category等信息,由系统自己去分析intent,找出合适的活动
-
在manifest.xml文件中,对应activity标签下配置<intent_filter>的内容
<activity android:name="SecondActivity"> <intent-filter> <action android:name="com.example.activitytest.ACTION_START"/>; <category android:name="android.intent.category.DEFAULT"/>; <category android:name="com.example.activitytest.ACTION_START"/>; <intent-filter/> </activity>
-
在FirstActivity.java文件中修改对应按钮的点击事件
botton1.setOnClickListener(){ @override public void onClick(View v){ Intent intent=new Intent("com.example.activity_test.ACTION_START"); Intent.addCategory("com.example.activity_test.MY_CATEGORY"); startActivity(intent); } });
-
-
-
使用intent向下一个活动传递数据:intent提供了一系列putExtra()方法的重载,可以将需要传递的数据暂存在intent中,启动另一个活动后,只需要把这些数据再从intent中取出即可。
-
例如:将first_activity中的数据传到second_activity中
//first_activity:用显式intent来启动second_activity button1.setOnClickListener(new View.OnClickListener(){ @override public void onClick(View v){ String data="pass to second activity"; Intent intent=new Intent(first_activity.this,sencond_activity.class); Intent.putExtra("extra data",data); startActivity(intent); } }; //second_activity public class second_activity extends AppCompatActivity { @override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) ; setContentView(R.layout.second_layout); Intent intent=getIntent(); String data=intent.getStringExtra("extra data"); } }
-
-
返回数据给上一个活动:startActivityForResult()方法:第一个参数是intent,第二个参数是请求码,用于在之后的回调中判断数据的来源(只要是一个唯一的值就可以了)。
//first_activity:用显式intent来启动second_activity button1.setOnClickListener(new View.OnClickListener(){ @override public void onClick(View v){ Intent intent=new Intent(first_activity.this,sencond_activity.class); startActivityForResult(intent,1); } }; //second_activity public class second_activity extends AppCompatActivity { @override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState) ; setContentView(R.layout.second_layout); Button button2=(Button) findViewById(R.id.button2); button2.setOnClickListener(new View.OnClickListener(){ @override public void onClick(View v){ Intent intent=new Intent(); Intent.putExtra("data_return","pass return to first activity"); setResult(RESULT OK,intent); finish(); } }); } }
-
-
活动的生命周期
-
四大状态:运行状态(位于返回栈的顶部),暂停状态(不位于栈顶,但是还是完全存活的),停止状态(不再出于栈顶,而且完全不可见,可能可能会被系统回收),销毁状态
-
activity类中定义的7个回调方法
- onCreate():活动第一次被创建时调用。完成活动的初始化操作,如加载布局、绑定事件等。
- onStart():活动由不可见变为可见时调用
- onResume():在活动准备好和用户进行交互时调用(位于返回栈的栈顶,且处于运行状态)
- onPause():系统准备去启动或恢复另一个活动时调用
- onStop():在活动完全不可见的时候调用
- onDestroy():在活动被销毁之前调用,释放内存,之后活动将变为销毁状态
- onRestart():在活动由停止状态变为运行状态之前调用
-
活动的三种生存期
- 完整生存期:onCreate和onDestroy之间
- 可见生存期:onStart和onStop之间,可见生存期内,活动对于用户总是可见的
- 前台生存期:onResume和onPause之间,处于运行状态,可以和用户进行交互
-
解决活动被回收时临时数据保存的问题:onSaveInstanceState()方法中携带了一个Bundle类型的参数,Bundle类型的参数提供了一系列用于保存数据的方法,如用putString保存字符串,用putInt保存整型数据
//被回收的活动中加入以下代码: @override protected void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); String tempData="something you just typed"; outState.putString("data_key",tempData); } @override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG,"onCreate"); setContentView(R.layout.activity_main); if(savedInstanceState!=null) { String tempData=savedInstanceState.getString("data_key"); Log.d(TAG,tempData); } }
-
-
活动的启动模式:在AndroidManifest.xml中,通过给<activity>标签指定android:launchMode属性来选择启动模式
- standard:默认模式,每启动一个新的活动,就会在反馈栈中入栈并处于栈顶。启动时,系统不会在乎该活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例
- singleTop:启动活动时如果发现该活动已经在返回栈的栈顶,则认为可以直接使用它,不会再创建新的活动实例
- singleTask:启动该活动时会首先在返回栈中检查是否存在该活动的实例,如果已存在,则直接使用存在的实例,并且把在这个活动之上的所有活动统统出栈
- singleInstance:为活动创建一个新的返回栈,解决了共享活动实例的问题