Android开发学习笔记 -- 活动相关

活动 Intent

活动简介

Activity包含用户界面的组建,主要用于与用户交互

手动创建过程

创建一个新的Empty ActivityGenerate Layout File选项是创建布局文件,也就是可视化的界面,Launcher Activity选项是将该活动设置为启动主活动

任何活动都要重写onCreate()方法,调用父类的onCreate()方法

创建一个layout文件夹存放布局文件,新建Layout resource file

onCreate()函数中添加

setContentView(R.layout.xxxlayout);

调用setContentView方法给当前活动加载一个布局,参数是布局文件的id

在AndroidManifest文件里注册,注册代码是

<application 
......
    <activity android:name=".FirstActivity"></activity>
</application>

如果是主活动,还需要配置<intent-filter>标签

<activity android:name=".FirstActivity"
    android:label="This is first activity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

销毁活动使用finish()

使用Toast

Toast.makeText(FirstActivity.this, "toast context", Toast.LENGTH_SHORT).show();

参数分别是:上下文,内容,时间长短

创建menu文件夹,新建Menu resource file,在文件中添加item

<menu .....>
    <item
        android:id="@+id/add_item"
        android:title="Add"/>
....
</menu>

然后重写onCreateOptionMenu()方法

public boolean onCreateOptionMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

再定义菜单响应事件

public boolean onOptionItemSelected(MenuItem item) {
    swich (item.getItemId()) {
    case R.id.add_item:
        .....
        bread;
    ...
    default:
    }
    return true;
}

活动之间的跳转

显式

首先创建活动,注册

在第一个活动中设置点击事件跳转

public void onClick(View v) {
    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    startActivity(intent);
}

intent表示就是意图

隐式

不明确指定要跳转的活动,而是指定条件,由系统分析该向哪一个活动跳转

指定的条件就是action和category信息,两者都满足的活动会是跳转目标

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

在第一个活动中添加

public void onClick(View v) {
    Intent intent = new Intent("com.example.activitytest.ACTION_START);
    startActivity(intent);
}

每个intent中只能指定一个,但category可以有多个

intent.addCategory("com.example.activitytest.MY_CATEGORY");

没有响应的活动程序会崩溃

更多隐式用法

还可以调用其他程序的活动,例如浏览器,拨号等等
以浏览器为例:

修改点击事件

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com));
startActivity(intent);

ACTION_VIEW是系统内置的动作,点击可以打开浏览器

可以在<intent-filter>里配置<data>标签,指定当前活动能响应什么类型的数据

  • android:scheme 协议
  • android:host 主机
  • android:path 主机名和端口后的部分
  • android:mimeType 可以处理的数据类型

数据传递

向下一个活动传递数据

intent中提供一系列putExtra()方法的重载,存放数据,启动第二个活动后,再从intent中取出来

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

取出数据的凭据是键值,在第二个活动中

Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");

返回数据给上一个活动

使用startActivityForResult()来启动,会在活动销毁的时候返回一个结果给上一个活动

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

1是请求码,只要是唯一值就行了

在第二个活动中写入返回逻辑

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

setResult()两个参数,第一个是返回的状态结果,第二个是带有数据的intent

在第一个活动中重载onActivityResult()方法

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    String returndata = data.getStringExtra("return_data");
                    Log.d("FirstActivity", returndata);
                }
                break;

            default:
        }
    }

请求码用来判断来源

活动的临时数据保存

Activity提供一个onSavedInstanceState()回调方法,在活动被回收之前一定会被调用,在该方法里面保存临时数据
使用Bundle类型参数

@Override
protected void onSavedInstanceState(Bundle outState) {
    super.onSavedInstanceState(outState);
    String tempData = "something";
    outState.putString("data_key", tempData);
}

在onCreate()方法有一个Bundle参数,可以从这里恢复数据

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.first_layout);

        if (savedInstanceState != null) {
            String tempData = savedInstanceState.getString("data_key");
            ...
        }
    }

活动的启动模式

一共4种,standard,singleTop,singleTask,singleInstance

可以在AndroidManifest.xml中给activity指定android:launchMode属性选择启动模式

  • standard
    这是默认的启动模式,每次启动创建一个新的实例

  • singleTop
    当启动活动时活动处于返回栈的栈顶,则直接使用,不会创建新的实例,但是如果不在栈顶就会创建新的实例

  • singleTask
    该活动在整个应用程序中只存在一个实例,启动之前会在返回栈中检查是否存在,如果发现存在,会把该活动之上的活动通通出栈,知道该实例在栈顶
    如果不存在则创建

  • singleInstance
    程序活动允许其他程序调用,创建单独的返回栈管理,不管哪个程序来访问该活动,共用同一个返回栈

Tips

获取当前活动信息

怎么判断当前是哪一个活动?
创建一个新类BaseActivity,继承AppCompatActivity,重写onCreate()方法,加入语句

Log.d("BaseActivity", getClass().getSimpleName());

一次退出多个程序

新建一个ActivityCollector类作为活动管理器

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中修改onCreate和onDestroy

//onCreate()
ActivityCollector.addActivity(this);
//onDestroy()
ActivityCollector.removeActivity(this);

一键退出

button3.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ActivityCollector.finishAll();
    }
});

启动活动的最佳写法

封装成一个方法,数据写参数中

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);
}

猜你喜欢

转载自www.cnblogs.com/burymyname/p/12119119.html
今日推荐