2.Android开发笔记:Activity

  • 活动(Activity)

1.创建活动:

       活动(Activity)是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交互。一个应用程序中可以包含零个或多个活动

       右击com.example.activitytest包→New→Activity→Empty Activity,会弹出一个创建活动的对话框,我们将活动命名为FirstActivity,并且不要勾选Generate File和Launcher Activity这两个选项,

public class FirstActivity extends AppCompatActivity {    
      @Override     
      protected void onCreate(Bundle savedInstanceState) {       
  super.onCreate(savedInstanceState);         
setContentView(R.layout.first_layout);     
}
}

       

2.创建布局

          Android程序的设计讲究逻辑和视图分离,最好每一个活动都能对应一个布局,布局就是用来显示界面内容的,因此我们现在就来手动创建一个布局文件。 右击app/src/main/res目录→New→Directory,会弹出一个新建目录的窗口,这里先创建一个名为layout的目录。然后对着layout目录右键→New→Layout resource file,又会弹出一个新建布局资源文件的窗口,我们将这个布局文件命名为first_layout

 

 3.为活动设置布局

     

  setContentView(R.layout.first_layout);

 

4.注册活动

  所有的活动都要在AndroidManifest.xml中进行注册才能生效

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitytest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".FirstActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"></action>
                <category android:name="android.intent.category.LAUNCHER"></category>
            </intent-filter>
        </activity>
    </application>

</manifest>

 

5.销毁活动:

        finish();

 

  • 布局上的按钮响应事件:
@Override
protected void onCreate(Bundle savedInstanceState) {

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

Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FirstActivity.this, "Button被点击", Toast.LENGTH_LONG)
.show();
}
});
}

 

  • 在活动中创建菜单:

 

 


1. 创建菜单:

  首先在res目录下新建一个menu文件夹,右击res目录→New→Directory,输入文件夹名menu,点击OK。接着在这个文件夹下再新建一个名叫main的菜单文件,右击menu文件夹→New→Menu resource file,输入main作为菜单文件名,

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:title="@string/additem" android:id="@+id/add_item"/>
    <item android:title="@string/removeItem" android:id="@+id/remove_item"/>
</menu>

2.添加菜单:
  在 Activity 类中, 按住快捷方式【Ctrl+O】,选择要重构的方法 【onCreateOptionsMenu】:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);    
   return true;
}
  • getMenuInflater()方法能够得到MenuInflater对象,再调用它的inflate()方法就可以给当前活动创建菜单了。
  • inflate()方法接收两个参数,

    第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里当然传入R.menu.main。

    第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,

  • 这里直接使用onCreateOptionsMenu()方法中传入的menu参数。

         然后给这个方法返回true,表示允许创建的菜单显示出来,如果返回了false,创建的菜单将无法显示。

 

3.菜单响应事件:

 按住快捷方式【Ctrl+O】,选择要重构的方法 【onOptionsItemSelected】:
@Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int itemId = item.getItemId();
     switch (itemId) {
            case R.id.add_item:
                Toast.makeText(this, "添加", Toast.LENGTH_LONG).show();
                Log.d("itemClick","添加");
                break;
            case R.id.remove_item:
                Toast.makeText(this, "删除", Toast.LENGTH_LONG).show();
                Log.d("itemClick","删除");
                break;
            default:
                Toast.makeText(this, "无效点击", Toast.LENGTH_LONG).show();
                Log.d("itemClick","无效点击");
                break;

        }
        return true;

}

 

  •  使用Intent在活动之间穿梭

 

      不管你想创建多少个活动,方法都和上一节中介绍的是一样的。
唯一的问题在于,你在启动器中点击应用的图标只会进入到该应用的主活动,
那么怎样才能由主活动跳转到其他活动呢?

 

  右击com.example.activitytest包→New→Activity→Empty Activity,
会弹出一个创建活动的对话框,我们这次将活动命名为SecondActivity,
并勾选Generate Layout File,给布局文件起名为second_layout,
但不要勾选Launcher Activity选项

    AndroidManifest.xml 自动注册了SecondActivity:

 <activity android:name=".SecondActivity"></activity>

由于SecondActivity不是主活动,因此不需要配置<intent-filter>标签里的内容,注册活动的代码也简单了许多。

第二个活动已经创建完成,剩下的问题就是如何去启动这第二个活动了,这里我们需要引入一个新的概念:Intent。

Intent

  Intent是Android程序中各组件之间进行交互的一种重要方式,
它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。
Intent一般可被用于启动活动、启动服务以及发送广播等场景,由于服务、广播等

 

    显式Intent

             修改FirstActivity中按钮的点击事件

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

  单击FirstActivity中的按钮,启动SecondActivity这个活动了。如果你想要回到上一个活动怎么办呢?很简单,按下Back键就可以销毁当前活动,从而回到上一个活动了。

 

  隐式Intent:

      指定了一系列更为抽象的action category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。

 

       在 AndroidManifest.xm 修改SecondActivity:

            

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

       

    修改FirstActivity中按钮的点击事件:

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

Intent intent2 = new Intent("com.example.activitytest.Xyz_Shuibian");
startActivity(intent2);

 只有 <action> 和 <category>中的内容同时能够匹配上Intent中指定的action 和 category时,这个活动才能响应该Intent。

android.intent.category.DEFAULT是一种默认的category ,

在调用 startActivity()方法的时候会自动将这个category添加到Intent中。

 

 每个Intent中只能指定一个action,但却能指定多个category。目前我们的Intent中只有一个默认的category,那么现在再来增加一个吧。

 

  在 AndroidManifest.xm 修改SecondActivity:

      <activity android:name=".SecondActivity">
            <intent-filter>
                <action android:name="com.example.activitytest.Xyz_Shuibian"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
                <category android:name="com.example.activitytest.Shuibian_category"></category>
            </intent-filter>
        </activity>

修改FirstActivity中按钮的点击事件:

     Intent intent2 = new Intent("com.example.activitytest.Xyz_Shuibian");
     intent2.addCategory("com.example.activitytest.Shuibian_category");
     startActivity(intent2);

 

 

      更多的Intent隐式:

     使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动。

这使得Android多个应用程序之间的功能共享成为了可能。比如说你的应用程序中需要展示一个网页,这时你没有必要自己去实现一个浏览器(事实上也不太可能),而是只需要调用系统的浏览器来打开这个网页就行了。

 

修改FirstActivity中按钮点击事件的代码:

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

指定了Intent的action 是 Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为android.intent.action.VIEW

Uri对象,主要用于指定当前Intent正在操作的数据

我们还可以在<intent-filter>标签中再配置一个<data>标签,用于更精确地指定当前活动能够响应什么类型的数据。<data>标签中主要可以配置以下内容

只有 <data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。

不过一般在<data>标签中都不会指定过多的内容,如上面浏览器示例中,其实只需要指定android:scheme为http,就可以响应所有的http协议的Intent了。

 

除了http协议外,我们还可以指定很多其他协议,比如

         geo表示显示地理位置、

        tel表示拨打电话。

         下面的代码展示了如何在我们的程序中调用系统拨号界面

首先指定了Intent的action 是 Intent.ACTION_DIAL,这又是一个Android系统的内置动作。

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

 

然后在data部分指定了协议是tel,号码是10086。重新运行一下程序,在FirstActivity的界面点击一下按钮:

 

posted @ 2020-03-01 12:56  easy5  阅读(253)  评论(0编辑  收藏  举报