• 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);
    }
    
  • 相关阅读:
    【排序算法汇总】
    Redis是否安装
    分布式与集群
    Redis学习
    简单算法定义见解
    KMP算法
    红黑树
    JSP与Servlet的关系
    7、创建图及图的遍历(java实现)
    6、二叉树树(java实现)
  • 原文地址:https://www.cnblogs.com/burymyname/p/12119119.html
Copyright © 2020-2023  润新知