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

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 生命周期图


Activity生命周期图

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

回收进程的优先级

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

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

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)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值