学习基于《第一行代码》第二章(郭霖)
重写方法的快捷键:Ctrl+0(Mac为control+O)
文章目录
一、在Activity中使用Menu
-
新建menu.xml
<menu> <item android:id="@+id/add_item" android:title="Add"/> <item android:id="@+id/remove_item" android:title="Remove"/> </menu>
-
在Activity中重写onCreateOptionsMenu()来获取到该menu
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu,menu); return true; }
-
在Activity中重写onOptionsItemSelected()来定义菜单响应事件
public boolean onOptionsItemSelected(MenuItem item){ switch(item.getItemId()){ ... } return true; }
二、用Intent跳转Activity
隐式Intent
1、普通跳转
需要<action>
和<category>
中的内容同时匹配上Intent中指定的action和category,如
Intent intent = new intent("com.example.activitytest.ACTION_START");
intent.addCategory("com.example.activitytest.MY_CATEGORY");
在mainfest中:
<intent-filter>
<action android:name="com.example.activitytest.ACTION_START" />
<category android:name="com.example.activitytest.MY_CATEGORY"/>
</intent-filter>
2、更多用法
使用隐式Intent,不仅可以启动程序内的活动,还可以启动其他程序的活动。如打开一个网站:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Url.parse("http://www.baidu.com"));
返回数据给上一个活动
有2个activity(Activity1,Activity2,其对应的布局文件分别有Btn_1和Btn_2)
-
在Activity1的按钮点击事件中:
Intent intent = new Intent(MainActivity.this, Activity2.class); startActivityForResult(intent,1);
这里的1为请求码,只要是唯一值就可以了。
-
在Activity2的按钮点击事件中设置回传
Intent intent = new Intent(); intent.putExtra("data_return","Hello FirstActivity"); setResult(RESULT_OK,intent); finish();
一般只使用RESULT_OK,RESULT_CANCELED这两个值
这段代码必须放在finish前面,即不能放在onPause(),onStop(),onDestroy()中
若要点击手机的返回键,则可以放在onBackPressed()中
-
在Activity1中重写onActivityResult函数,来获取回传过来的值
/** * * @param requestCode 请求吗 * @param resultCode 返回数据中传入的处理结果(一般为RESULT_OK、RESULT_CANCELED) * @param data 携带着返回数据的Intent */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode){ case 1: if(resultCode == RESULT_OK){ String returnedData = data.getStringExtra("data_return"); Log.e("111",returnedData); Toast.makeText(MainActivity.this,returnedData,Toast.LENGTH_SHORT).show(); } break; } }
三、活动的生命周期
4种活动状态:运行状态、暂停状态、停止状态、销毁状态
暂停和停止的区别:停止为完全不可见,若启动的新活动是一个对话框式的活动,则为暂停状态。
系统回收概率为4种状态的倒序
若担心停止状态的活动被系统误回收,则可以重写onSaveInstanceState(),如
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String name = "...";
outState.putString("name",name);
}
同时在onCreate方法中获取到
if(savedInstanceState != null){
String name = savedInstanceState.getString("name");
}
四、Activity的小技巧
1. 知晓当前运行的是在哪个活动
可以用getClass().getSimpleName());
2.创建活动管理器 可以方便管理,方便直接退出程序
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();
}
public static void exitApp(){
finishAll();
android.os.Process.killProcess(android.os.Process.myPid());
} }
为了方便每个Activity的管理,可以写入BaseActivity中
//BaseActivity应用
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("BaseActivity", getClass().getSimpleName());
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
}
3. 启动活动的最佳写法
public static void actionStart(Context context, String data1, String data2){
Intent intent=new Intent(context,Main2Activity.class);
intent.putExtra("param1",data1);
intent.putExtra("param2",data2);
}