Android第一行代码——第二章探究活动1

日志工具Log(第一章)

Log语句

  • Log.v()。用于打印那些最为琐碎的、意义最小的日志信息。对应级别verbose,是Android日志里面级别最低的一种。
  • Log.d()。用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别debug,比 verbose高一级。
  • Log.i()。用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分析用户行为数据。对应级别info,比 debug高一级。
  • Log.w()。用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。对应级别warn,比 info高一级。
  • Log.e()。用于打印程序中的错误信息,比如程序进入到了catch语句当中。当有错误信息打印出来的时候,一般都代表你的程序出现严重问题了,必须尽快修复。对应级别error,比 warn高一级。

例:在MyActivity中添加一行打印日志:

protected void onCreate( Bundle savedInstancestate){
	super.onCreate( savedInstanceState) ;
	setContentView(R.layout.hello_world_layout);
	Log.d("HelloworldActivity", "onCreate execute");
}

Log.d()方法中传入了两个参数:第一个参数是tag,一般传人当前的类名就好,主要用于对打印信息进行过滤;第二个参数是msg,即想要打印的具体的内容

Log 对比 System.out

System.out.println()方法:
优点

  1. 使用方便,在Eclipse中输入syso+Alt+/这个方法就会自动出来

缺点

  1. Android Studio 中不支持这种快捷输入。
  2. 日志打印不可控制
  3. 打印时间无法确定
  4. 不能添加过滤器
  5. 日志没有级别区分
  6. .……

活动的什么

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

活动基本用法

由于Android Studio在一个工作区间内只允许打开一个项目,因此首先你需要将当前的项目关闭,点击导航栏File→Close Project.然后再新建一个Android项目,项目名可以叫作ActivityTest,包名我们就使用默认值 com.example.activitytest。

创建和加载布局

first_layout.xml

添加Button
  • <Button:这里添加了一个Button元素,并在Button元素的内部增加了几个属性。
  • android:id是给当前的元素定义一个唯一标识符,之后可以在代码中对这个元素进行操作。如果你需要在XML中引用一个id,就使用@id/id_name这种语法,而如果你需要在XML 中定义一个id,则要使用@+id/id_name这种语法。
  • android:layout_width :指定了当前元素的宽度,这里使用match_parent表示让当前元素和父元素一样宽
  • android:layout_height 指定了当前元素的高度,这里使用wrap_content表示当前元素的高度只要能刚好包含里面的内容就行。
  • android:text指定了元素中显示的文字内容
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="按钮1" />
</LinearLayout>

在这里插入图片描述

FirstActivity.java

加载布局
  • setContentView()方法:给当前的活动加载一个布局。传入一个布局文件的id。由于项目中添加的任何资源都会在R文件中生成一个相应的资源id,因此我们刚才创建的first_layout.xml布局的id现在应该是已经添加到R文件中了。只需要调用R.layout.first_layout就可以得到first_layout.xml布局的id,然后将这个值传入setContentView()方法即可。
@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	Log.d("FirstActivity","Task id is"+getTaskId());
	setContentView(R.layout.first_layout);

在AndroidManifest文件中注册

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

注册声明要放在<application>标签内,通过<activity>标签对活动进行注册。

  • 主活动:在<activity>标签的内部加入<intent-filter>标签,并在这个标签里添加<action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category . LAUNCHER"/>这两句声明即可。

  • android:label:指定活动中标题栏的作用。给主活动指定的label不仅会成为标题栏内容,还会成为启动器(Launcher)中程序显示的名称

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

Toast

提醒方式,短暂的信息通知

FirstActivity.java

用Button作为Toast的触发点

  • findViewById()方法:获取布局文件中定义的元素,这里传入R.layout.first_layout。这个方法返回的是View对象,需要向下转型将其转成Button对象
  • button1.setOnClickListener():为按钮注册监听器,点击按钮时就会执行监听器中的onClick()方法。所以Toast功能要在onClick()中写。
  • Toast.makeText()通过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来。makeText()方法需要传入3个参数:
    1. 第一个参数是Context,也就是Toast要求的上下文,由于活动本身就是一个Context对象,因此这里直接传入 FirstActivity.this;
    2. 第二个参数是Toast显示的文本内容
    3. 第三个参数是Toast显示的时长,有两个内置常量可以选择Toast.LENGTH_SHORTToast.LENGTH_LONG.
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.first_layout);
    Button button1 = (Button) findViewById(R.id.button_1);
    button1.setOnClickListener(new OnClickListener(){
			public void onClick(View v){
				//Toast显示
				Toast.makeText(FirstActivity.this, "你点击了按钮1", Toast.LENGTH_SHORT).show();

Menu

创建收缩菜单

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

main.xml

  • <item>:创建具体某一菜单项
  • <android:id>:给这个菜单项指定一个唯一标识符
  • <android:title>:给这个菜单项指定一个名称
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/add_item"
        android:title="Add" />
    <item
        android:id="@+id/remove_item"
        android:title="Remove" />
</menu>

FirstActivity.java

  • getMenuInflater()方法:得到MenuInflater对象,再调用它的inflate()方法即可给当前活动创建菜单

  • inflate()方法:两个参数:

    1. 第一个参数用于指定我们通过哪一个资源文件来创建菜单,这里传入R.menu.main
    2. 第二个参数用于指定我们的菜单项将添加到哪一个Menu对象当中,这里直接使用onCreate0ptionsNenu()方法中传入的menu参数。

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

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

  • onOptionsItemSelected():定义菜单响应事件,让菜单真正可用
  • item.getItemId():判断点击的是哪一个菜单项
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
	switch (item.getItemId()){
		case R.id.add_item:
			Toast.makeText(this,"你点击了add",Toast.LENGTH_SHORT).show();
             break;
        case R.id.remove_item:
            Toast.makeText(this,"你点击了remove",Toast.LENGTH_SHORT).show();
            break;
        default:
    }
    return true;
}

销毁活动

Activity提供的finish()方法

button1.setOnClickListener(new OnClickListener(){
	public void onClick(View v){
	finish();
	}
});

使用Intent在活动间穿梭

各组件之间进行交互

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

显示Intent

  • Intent构造函数:
    Intent(Context packageContext,class<?>cls)
    这个构造函数接收两个参数:
  1. 第一个参数Context 要求提供一个启动活动的上下文
  2. 第二个参数Class则是指定想要启动的目标活动
  • Activity类中提供了一个startActivity()方法,这个方法是专门用于启动活动的,它接收一个Intent 参数,这里我们将构建好的 Intent 传入startActivity()方法就可以启动目标活动了。

FirstActivity.java

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

隐式Intent

单个category

AndroidManifest.xml

在< action >标签中指明了当前活动能够响应com.example.myactivitytest.ACTION_START这个Action。只有<actions><category>中的内容同时能够匹配上Intent中指定的action和category,这个活动才相应Intent。

<activity android:name=".SecondActivity"
    <intent-filter>
    	<action android:name="com.example.myactivitytest.ACTION_START" />
    	<category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
FirstActivity.java

Intent另一个构造函数:
Intent("com.example.myactivitytest.ACTION_START");
直接将action的字符串传进去了。而<category android:name="android.intent.category.LAUNCHER" />中的android.intent.category.LAUNCHER是默认的category,在调用 startActivity(intent)时自动将这个category添加到Intent。

public void onClick(View v){               
	//隐式Intent
	Intent intent = new Intent("com.example.myactivitytest.ACTION_START");
	startActivity(intent);

多个category

每个Intent指定一个action,但可以指定多个category。

FirstActivity.java

调用Intent中的intent.addCategory()方法添加一个category,值为com.example.myactivitytest.MY_CATEGORY

public void onClick(View v){               
	//隐式Intent
	Intent intent = new Intent("com.example.myactivitytest.ACTION_START");
    intent.addCategory("com.example.myactivitytest.MY_CATEGORY");
	startActivity(intent);
AndroidManifest.xml

添加category声明

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

更多隐式Intent用法

隐式Intent不仅可以启动自己程序的活动,还能启动其它程序的活动

打开百度

FirstActivity.java

指定Intent的action是Intent.ACTION_VIEW,这是一个Android系统内置的动作,其常量值为 android.intent.action.VIEW。然后通过Uri.parse()方法,将一个网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个Uri对象传递进去。

public void onClick(View v){
    //打开百度
	Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("http://baidu.com"));
    startActivity(intent);
ThiedActivity.java

还可以在<intent-filter>标签中再配置<data>标签,用于更精确地指定当前活动可以响应什么数据

  • android: scheme。用于指定数据的协议部分,如上例中的 http部分。
  • android:host。用于指定数据的主机名部分,如上例中的 www.baidu.com部分。
  • android:port。用于指定数据的端口部分,一般紧随在主机名之后。
  • android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
  • android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="点击进入百度" />

</LinearLayout>
AndroidManifest.xml

配置<data>标签

<activity android:name=".ThirdActivity">
	<intent-filter tools:ignore="AppLinkUrlError">
    	<action android:name="android.intent.action.VIEW" />
    	<category android:name="android.intent.category.DEFAULT" />
    	<data android:scheme="http"/>
    </intent-filter>
</activity>

拨号

FirstActivity.java

首先指定了Intent的 action是 Intent.ACTION_DIAL,这又是一个Android系统的内置动作。然后在 data部分指定了协议是 tel,号码是10086。

public void onClick(View v){
    //拨号
	Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:13862058487"));
    startActivity(intent);

向下一个活动传递数据

FirstActivity,java

  • putExtra()方法:传递一个字符串。putExtra()方法接收两个参数,第一个参数是,用于后面从Intent 中取值,第二个参数才是真正要传递的数据
public void onClick(View v){
    //向下一个活动传递数据
	String data = "你好 SecondActivity";
	Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
	intent.putExtra("extra_data",data);
    startActivity(intent);

SecondActivity.java

  • getIntent()方法:获取到用于启动SecondActivity 的Intent,然后调用getStringExtra()方法,传入相应的键值,就可以得到传递的数据了。这里由于我们传递的是字符串,所以使用getStringExtra()方法来获取传递的数据。如果传递的是整型数据,则使用getIntExtra()方法;如果传递的是布尔型数据,则使用getBooleanExtra()方法,以此类推。
//向下一个活动传递数据
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);

返回数据给上一活动

FirstActivity.java

  • 使用startActivityForResult()方法来启动SecondActivity的,在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法.请求吗是个唯一值即可,这里传入了1。而在结束SecondActivity后会返回这里,重写onActivityResult()
  • onActivityResult()三个参数:
    1. 第一个参数requestCode,即我们在启动活动时传入的请求码。
    2. 第二个参数resultCode,返回数据时传入的处理结果。
    3. 第三个参数data,即携带着返回数据的Intent。
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("FirstActivity","Task id is"+getTaskId());
        setContentView(R.layout.first_layout);
        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new OnClickListener(){
            public void onClick(View v){
				//返回数据给上一个活动
				Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
				startActivityForResult(intent,1);
			}
		}
	}
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    String returnedData = data.getStringExtra("data_return");
                    Log.d("FirstActivity", returnedData);
                }
                break;
            default:
        }

SecondActivity.java

  • setResult()方法:向上一个活动返回数据。接收两个参数:

    1. 第一个参数用于向上一个活动返回处理结果,一般只使用RESULT_OKRESULT_CANCELED这两个值,
    2. 第二个参数则把带有数据的Intent传递回去,然后调用了finish()方法来销毁当前活动。
  • onBackPressed():数据返回

@Override
public void onClick(View view) {
	//返回数据给上一活动
	Intent intent = new Intent();
    intent.putExtra("data_return","你好FirstActivity");
    setResult(RESULT_OK,intent);
    finish();
@Override
public void onBackPressed() {   //数据返回
	Intent intent = new Intent();
    intent.putExtra("data_return","返回FirstActivity");
    setResult(RESULT_OK,intent);
    finish();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值