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 生命周期图
(可见和不可见,都是相对于用户而言)
onCreate() 准备状态
onStart() 可见不可操作状态
onResume()可见可操作状态
onPause() 可见不可操作状态(onPause可以回到onResume)
onStop( ) 不可见不可操作 通过onRestart()可以回到onStart( ), 如果被系统停止,必须回到onCreate( )状态
onDestroy( ) 进程销毁
回收进程的优先级
foreground activity < visible activity < background activit < empty proess(前面两个,一般都不会被回收)
OnSaveInstancestate (系统销毁之前保存数据)(面试会问到的问题)
系统销毁之前保存数据,两种情况: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/" ));//查看通讯录
下面是Intent的属性Data中几个常用的属性
注:
一个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)