Android基础知识【chapter-4】Activity和Intent

时间:2022-11-05 15:31:45

Android基础知识【chapter-4】Activity和Intent

 本章主要讲到Android的基本组件Activity以及重要桥梁Intent

小Tips:

用户权限:(上网,拨号都需要在.Manifests中申请权限)

<uses-permission android:name="android.permission.CALL_PHONE" ></uses-permission>
<uses-permission android:name="android.permission.INTERNET" ></uses-permission>

Toast

Toast. makeText(MainActivity.this,text,Toast .LENGTH_LONG ).show();//用于把消息显示在屏幕上几秒钟,其中text是字符串

一:继承于AppCompatActivity

每个Activity,都要在AndroidMainFest.xml文件中注册
有且只有一个主Activity,需要在注册文件中加

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

<application
android :allowBackup="true"
android :icon="@mipmap/ic_launcher"
android :label="@string/app_name"
android :theme="@style/AppTheme" >


<activity
android:name=".MainActivity"
android:label="@string/app_name" >

<intent-filter>
<action android :name="android.intent.action.MAIN" />

<category android :name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity >

</application >

</manifest>

二:Activity 生命周期图


Android基础知识【chapter-4】Activity和Intent

(可见和不可见,都是相对于用户而言)
onCreate() 准备状态
onStart() 可见不可操作状态
onResume()可见可操作状态
onPause() 可见不可操作状态(onPause可以回到onResume)
onStop( ) 不可见不可操作 通过onRestart()可以回到onStart( ), 如果被系统停止,必须回到onCreate( )状态
onDestroy( ) 进程销毁

回收进程的优先级

    foreground activity < visible activity < background activit < empty proess(前面两个,一般都不会被回收)

OnSaveInstancestate (系统销毁之前保存数据)(面试会问到的问题)

Android基础知识【chapter-4】Activity和Intent

系统销毁之前保存数据,两种情况:1:死机了,2:屏幕旋转
在onCreate(Bundle) 或者onRestoreInstanceState(Bundle)中来恢复
在onCreate()中,要自己判断saveinstancestate是否为空,
在onRestoreInstanceState中,只有saveinstancestate不为空才会调用

onConfigurationchanged() 屏幕旋转


 屏幕旋转一般系统都会销毁程序,启动OnSaveInstancestate  来保存数据
只有android:configchanges=“Screenlayout|ScreenSiz|Orientation”屏幕旋转才不会销毁数据

三:Activity的跳转,Intent

不带数据的跳转

/跳转的监听

mstart.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建一个intent,并指定一个Activity
Intent intent=new Intent(MainActivity.this,NextActivity. class);
或者是// Intent intent=new Intent(); intent.setClass(MainAcitivy.this,NextActivy.class)
//启动intent
startActivity(intent);
}
});

带数据的跳转

Intent intent=new Intent(MainActivity. this,NextActivity. class);
intent.putExtra("姓名" ,"杨杰" );
intent.putExtra("年龄" ,18 );
intent.putExtra("身高" ,175);
startActivity(intent);


Intent intent=getIntent();
String name=intent.getStringExtra("姓名" );
int age=intent.getIntExtra( "年龄", 0);
int height=intent.getIntExtra( "身高", 0);

带对象的跳转(对象需要序列化)

1:实现Serializable接口(优点:简单,缺点:效率比较慢)
2:实现Parcelable接口(优点:效率比较高,缺点:麻烦)我们推荐一致使用第二种,效率才是程序的王道

package com.example.yangjie.android_widgets_byyj;

import android.os.Parcel;
import android.os.Parcelable;

import java.io.Serializable;

/**
* Created by Administrator on 2015/9/7.
*/

public class Person2 implements Parcelable {//也可以是Serializable
private String name ;
private int age;

public Person2(String name, int age) {
this .name = name;
this .age = age;
}

protected Person2(Parcel in) {
name = in.readString();
age = in.readInt();
}

public static final Creator<Person2> CREATOR = new Creator<Person2>() {
@Override
public Person2 createFromParcel(Parcel in) {
return new Person2(in);
}

@Override
public Person2[] newArray(int size) {
return new Person2[size];
}
};

public String getName() {
return name;
}

public void setName(String name) {
this .name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this .age = age;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
}
}
---------------------------------------------------------------------------------------------------------
mstart.setOnClickListener( new View.OnClickListener() {
// Person person =new Person("苏龙飞",20);
Person2 person=new Person2("苏龙飞", 20);
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,NextActivity. class);

intent.putExtra("person",person);
startActivity(intent);

}
});




Intent intent=getIntent();

// Person person=(Person)intent.getSerializableExtra("person");
Person2 person=(Person2) intent.getParcelableExtra( "person");
mtext.setText(" \n姓名:"+person.getName()+ "\n年龄:" +person.getAge());
}

传递数据过去,并带数据回来

startActivityforresult()启动获取数据的界面
在新的界面结束前,调用SetResult()方法设置数据
在原来的Activity中,重写onActivityResult()获取返回的结果

startActivityForResult(intent,REQUEST_CODE);//REQUEST_CODE是一个常数,可以定义为一个常数1

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {//专门用来接受返回数据的方法,接受之前先判断
if(requestCode==REQUEST_CODE ){
if (resultCode==RESULT_OK){
Log.v( LOG_TAG,data.getStringExtra( "result"));
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {//onKeyDown()专门用来设置返回数据的方法
if(keyCode==KeyEvent.KEYCODE_BACK){
Intent intent=new Intent();
intent.putExtra("result", "Hello");
setResult(RESULT_OK,intent);

finish();

}
return true;
}

跳转到另外一个app (跨进程)

//跳转到的app
<intent-filter >
<action android:name= "com.Call.CALL"></ action>
<category android:name="android.intent.category.DEFAULT" ></category>
</intent-filter>

//跳转另外一个app的app
mchange.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent("com.Call.CALL");//打电话
startActivity(intent);
}
});



//连接系统的程序
mcall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(Intent. ACTION_DIAL);
intent.setData(Uri.parse ("tel:18381330154" ));//打电话
startActivity(intent);

/* Intent intent =new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse ("content://contacts/people/" ));//查看通讯录

Android基础知识【chapter-4】Activity和Intent
Android基础知识【chapter-4】Activity和Intent
Android基础知识【chapter-4】Activity和Intent
Android基础知识【chapter-4】Activity和Intent

下面是Intent的属性Data中几个常用的属性

Android基础知识【chapter-4】Activity和Intent

注:

一个Activity可以注册多个
一个可以注册多个action
action可以是任意命名
每一个只能注册一个category

Intent跳转的几个属性(在.MainFest文件中) (面试中%99都会问的)

android:launchMode=”standard”,标准的,标记的Activity,每次使用都会创建新的实例
android:launchMode=”singleTop”,只有在顶部的Activity,再次跳转时,不会创建新的实例,否则都会创建新的实例
android:launchMode=”singleTask” ,如果存在一个该实例,就会直接使用,而不会创建新的实例
android:launchMode=”singleInstance”,它是位于一个独立的Activity堆栈,不会创建新的实例 用的比较少
android:noHistory=”true”不保存该Activity的实例,相当于这个Activity消失了(比如在登陆成功时,我们不需要再返回到登陆界面,我们就可以再登陆的Activity中的注册文件的属性中设置nonoHistory,这样按返回键,就不会返回到登陆界面 )


以上的属性,都可以在Activity的代码中用intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);如果为singleTop,如果实例存在,就不会创建新的实例 这个还是比较常用的,相当于”singleTask”

重要事件通告
本人的github地址,有一些有意思的小东西,欢迎follow(https://github.com/KellenHu)