活动(Activity)

一、用Log打印日志

Log.d("HelloWorldActivity", "onCreate execute");

二、Toast用法

Toast.makeText(MainActivity.this, "You Clicked Button", Toast.LENGTH_SHORT).show();

三、在活动中使用Menu

首先在res目录下新建menu文件夹,接着在这个文件夹下新建一个名叫main的菜单文件,在main.xml中添加如下代码

<item
    android:id="@+id/add_item"
    android:title="Add" />
<item
    android:id="@+id/remove_item"
    android:title="Remove" />

回到Activity中重写onCreateOptionsMenu()方法,编写如下代码(返回true表示允许创建的菜单显示出来)

getMenuInflater().inflate(R.menu.main, menu);
return true;

还要定义菜单响应事件,在Activity中重写onOptionsItemSelected()方法,编写代码如下

switch (item.getItemId()){
case R.id.add_item:
      Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
      break;
case R.id.remove_item:
      Toast,makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
      break;
default:
}
return true;

四、销毁一个活动

finish();

五、使用显示Intent

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);

六、使用隐式Intent

通过在SecondActivity的<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category,打开AndroidManifest.xml,添加如下代码

<intent-filter>
    <action android:name="com.example.activitytest.ACTION_START" />
    <category android:name="android.intent.category.DEFAULT" />
  <category android:name="com.example.activitytest.MY_CATEGORY" />
</intent-filter>

在FirstActivity中

Intent intent = new Intent("com.example.activitytest.ACTION_STAART");
intent.addCategory("com.example.activitytest.MY_CATEGORY"); startActivity(intent);

七、更多隐式Intent的用法

调用系统拨号界面

Intent intent = new Intent(Intent.ACTION_DIAL); 
intent.setData(Uri.parse("tel:10086")); startActivity(intent);

八、向下一个活动传递数据

String data = "Hello SecondActivity"
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);

在SecondActivity中将传递的数据取出,并打印出来

Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);

九、返回数据给上一个活动

startActivityForResult()方法(第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源)来启动SecondActivity

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);

在SecondActivity中给按钮注册点击事件,并添加返回数据的逻辑(setResult()方法用于向上一个活动返回处理数据。第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED,第二个参数则把带有数据的Intent传递回去)

Intent intent =  new Intent();
intent.putExtra("data_return", Hello FirstActivity);
setResult(RESULT_OK, intent);
finish();

由于是使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个会动的onActivityResult()方法,因此需要在FirstActivity中重写这个方法来得到返回的数据

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
        case 1:
            if (resultCode == RESULT_OK) {
                String returnData = data.getStringExtra("data_return");
                Log.d("FirstActivity", returnData);
            }
            break;
       default:
    }
}                                                                    

还可以通过Back键回到FirstActivity并得到返回数据(重写onBackPressed()方法)

public void onBackPressed(){
    Intent intent = new Intent();
    intent.putExtra("data_return", "Hello FirstActivity");
    setResult(RESULT_OK, intent);
    finish();
}

 十、活动的启动模式

在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有4种,分别是standard、singleTop、singleTask和singleInstance,可以在AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来选择启动模式(返回栈中存在多少实例,就需要连按多少次Back键才嫩退出程序)

1、standard是活动默认的启动模式,对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中 存在,每次启动都会创建该活动的一个新的实例

2、当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。不过当活动并未处于栈顶位置时,这时再启动该活动,还是会创建新的实例的

3、当活动的启动模式指定为singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例

4、指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动

十一、随时随地退出程序

如果我们的程序需要一个注销或者退出的功能,那么就会用到如下方案,只需要用一个专门的集合类对所有的活动进行管理就可以了,代码如下

public class ActivityCollector {
    public static List<Activity> activities = new ArrayList<>();
    
    public static void addActivity(Activity activity){
        activities.add(activity);
    }
    
    public static void removeActivity(Actuvuty activity){
        activities.remove(activity);
    }
    
    public static void finishAll(){
        for (Activity activity : activities) {
            if (!activity.isFinishing()) {
                activity.finish();
            }
        }
        activities.clear();
    }
}

接下来修改BaseActivity中的代码,在onCreate()方法中调用了ActivityCollector的addActivity()方法,表明将当前正在创建的活动添加到活动管理器里(ActivityCollector.addActivity(this);)。然后重写了onDestroy()方法,并调用了ActivityCollector的removeActivity()方法,表明将一个马上要销毁的活动从活动管理器里移除(ActivityCollector.removeActivity(this);)。之后不管在什么地方退出程序,只需要调用ActivityCollector.finishAll()方法就可以了

 

posted @ 2018-04-08 10:48  十里霜天  阅读(785)  评论(0编辑  收藏  举报