您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
安卓第九天笔记-Activity
 
作者:森林森 来自于:博客园 发布于 2016-3-24
  1945  次浏览      19
 

1.创建Activity

一个界面对应一个activity

创建一个Activity

1.写一个JAVA类,继承Activity

publicclass CalcActivity extends Activity {

2.为这个Activity写一个布局文件

3.在Activity中重写OnCreate()方法,并设置显示的内容setContentView(R.layout.xxx)xxx表示布局文件的名称

4.在Manifest.xml文件中为Activity注册

<activity android:name="com.itheima.rp.CalcActivity"></activity>

2.人品计算器

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".LogoActivity" >

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/logo"/>

</RelativeLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center_horizontal"

android:orientation="vertical" >

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="10dp"

android:text="人品计算器"

android:textColor="#66ff0000"

android:textSize="32sp" />

<EditText

android:id="@+id/et_name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="请输入您的姓名" />

<Button

android:onClick="calc"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="计算"/>

<TextView

android:id="@+id/tv_result"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

</LinearLayout>

LogoActivity

/**

* Logo界面

public class LogoActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_logo);

//打开后显示的LOGO界面

new Thread(){

public void run() {

//显示5秒后连接到切换到下一个Activity

SystemClock.sleep(5000);

startActivity(new Intent(LogoActivity.this, CalcActivity.class));

//关闭掉这个Activity不然后退就又回到Logo界面了

finish();

};

}.start();

}

}

CalcActivity

/**

* 创建一个Activity

* 1.写一个JAVA类,继承Activity

* 2.为这个Activity写一个布局文件

* 3.在Activity中重写OnCreate()方法,并设置显示的内容setContentView(R.layout.xxx)xxx表示布局文件的名称

public class CalcActivity extends Activity {

private EditText et_name;

private TextView tv_result;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//设置要显示的内容布局文件

setContentView(R.layout.activity_calc);

et_name = (EditText) findViewById(R.id.et_name);

tv_result = (TextView) findViewById(R.id.tv_result);

}

* 计算人品

* @param v

public void calc(View v){

//获取名称

String name = et_name.getText().toString().trim();

if(TextUtils.isEmpty(name)){

Toast.makeText(this, "姓名不能为空", Toast.LENGTH_SHORT).show();

return;

}

//不为空就开始计算

byte[] bytes = name.getBytes();

//结果

int sum=0;

for (byte b : bytes) {

int tmp=b&0xff;

sum+=tmp;

}

//开始计算人品

int rp=sum/100;

if (rp>9) {

tv_result.setText("人名:"+name+"--->人品:"+rp+"===人品帅到掉渣,当世的活菩萨");

}else if(rp>6){

tv_result.setText("人名:"+name+"--->人品:"+rp+"===一般一般世界第三,");

}else{

tv_result.setText("人名:"+name+"--->人品:"+rp+"===上辈子没有干坏事,好好活着");

}

}

}

计算和结果都在一个界面完成的,

下面再加一个界面只用于显示结果

并把图片带过去

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center_horizontal"

android:orientation="vertical" >

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="结果显示"/>

<ImageView

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

<TextView

android:id="@+id/tv_result"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

</LinearLayout>

Activity

更改CalcActivity

//开始计算人品

String str;

int rp=sum/100;

if (rp>9) {

str="人名:"+name+"--->人品:"+rp+"===人品帅到掉渣,当世的活菩萨";

}else if(rp>6){

str="人名:"+name+"--->人品:"+rp+"===一般一般世界第三,";

}else{

str="人名:"+name+"--->人品:"+rp+"===上辈子没有干坏事,好好活着";

}

// 发送数据到另外一个Activity

Intent intent = new Intent();

intent.setClass(this, ResultActivity.class);

//添加数据字符串

intent.putExtra("data", str);

//把图片的ID放时去

intent.putExtra("rp", R.drawable.logo);

startActivity(intent);

结果页面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center_horizontal"

android:orientation="vertical" >

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="结果显示"/>

<ImageView

android:id="@+id/iv_display"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

<TextView

android:id="@+id/tv_result"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="结果显示"/>

</LinearLayout>


/**

* 创建一个Activity

* 1.写一个JAVA类,继承Activity

* 2.为这个Activity写一个布局文件

* 3.在Activity中重写OnCreate()方法,并设置显示的内容setContentView(R.layout.xxx)xxx表示布局文件的名称

public class ResultActivity extends Activity {

private TextView tv_result;

private ImageView iv_display ;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//设置要显示的内容布局文件

setContentView(R.layout.activity_result);

tv_result = (TextView) findViewById(R.id.tv_result);

iv_display = (ImageView) findViewById(R.id.iv_display);

//获取Intent

Intent intent = getIntent();

//获取数据

String data = intent.getStringExtra("data");

//设置值

tv_result.setText(data);

//获取图片

int rpMap = intent.getIntExtra("rp", 0);

//设置图片

iv_display.setImageResource(rpMap);

}

}

3.使用Intent传递多种数据

3.1传递简单数据

Intent intent = new Intent();

intent.setClass(this, SecondActivity.class);

//传递普通数据

intent.putExtra("name", "张三");

intent.putExtra("age", 18);

intent.putExtra("flag", true);

startActivity(intent);

3.2传递复杂数据

1.传递一个对象,对象的类要实现Parcelable

Intent intent = new Intent();

intent.setClass(this, SecondActivity.class);

//传一个对象

//前提 是person实现了Parcelable接口

Person person = new Person("刘楠", 30);

intent.putExtra("person", person);

startActivity(intent);

获取

Intent intent = getIntent();

//获取数据n

String name = intent.getStringExtra("name");

int age = intent.getIntExtra("age", 2);

boolean flag = intent.getBooleanExtra("flag", false);

Person p=intent.getParcelableExtra("person");

Toast.makeText(this,p.toString(), Toast.LENGTH_SHORT).show();

实际上只要让javaBean实现Serializable 接口就可以了,不管是传递单个对象,或者是传递一个集合,都没问题。

4. 启动界面的两种方式

4.1显示意图

只要指定上下文,和具体的类就可以跳转

能够直接知道跳转的界面

注册:

<activity android:name="com.itheima.start.Activity01"></activity>

跳转:

Intent intent = new Intent(this , Activity01.class);

startActivity(intent);

作用: 一般是启动自己程序的界面,其他程序的界面通过这种方式无法启动

如果使用了显式手法注册,还想被其他应用程序打开, 那么可以在activity标签里面,加上

android:exported="true"

4.2 隐匿意图

不知道要打开的界面是什么样子的,只有运行了才知道

要指定Action与data才可以

/**

* 显示意图打开Activity02

* @param v

public void click1(View v){

Intent intent = new Intent();

intent.setClass(this, SencondActivity.class);

startActivity(intent);

}

<activity android:name="com.itheima.intentstart.SencondActivity"></activity>

隐匿意图要指定Action,

<!--隐匿意图  -->

<activity android:name="com.itheima.intentstart.SencondActivity">

<intent-filter >

<!--Action -->

<action android:name="com.itheima.intentstart.Second"/>

<!--设置为默认的 -->

<category android:name="android.intent.category.DEFAULT"/>

</intent-filter>

</activity>


/**

* 隐式意图打开Activity02

* @param v

public void click2(View v) {

Intent intent = new Intent();

intent.setAction("com.itheima.intentstart.Second");

intent.addCategory("android.intent.category.DEFAULT");

startActivity(intent);

}

4.3 参数

作用: 跳转其他的应用程序界面,或者是自己的应用程序界面想被其他的程序打开

详细参数:

action: 动作

category 分类

data: 指定数据, 一般关注两个:scheme 和 mimetype

android:scheme="itheima" android:path="www.itheima" android:mimeType="text/plain"

4.4隐匿意图打打SMS

<Button

android:onClick="shareSms"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="打开手机短信" />


/**

* 隐匿意图 打开手机SMS界面

* 源码

* <intent-filter>

<action android:name="android.intent.action.VIEW" />

<action android:name="android.intent.action.SENDTO" />

<category android:name="android.intent.category.DEFAULT" />

<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="sms" />

<data android:scheme="smsto" />

</intent-filter>

* @param v

public void shareSms(View v){

Intent intent = new Intent();

intent.setAction("android.intent.action.VIEW");

intent.addCategory("android.intent.category.BROWSABLE");

intent.setData(Uri.parse("sms:"));

//设置数据

intent.putExtra("sms_body", "这是要传过去的内容");

startActivity(intent);

}

点击按键,显示界面

4.5 打开浏览器

/**打开系统的浏览器

* <intent-filter>

<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />

<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="http" />

<data android:scheme="https" />

<data android:scheme="about" />

<data android:scheme="javascript" />

</intent-filter>

* @param v

public void onOPenBrower(View v){

Intent intent = new Intent();

intent.setAction("android.intent.action.VIEW");

intent.addCategory("android.intent.category.BROWSABLE");

intent.setData(Uri.parse("http://www.baidu.com"));

startActivity(intent);

}

5.多个Activity之间获取数据与传递

打开下一个界面,然后返回数据

场景

QQ聊天给好友发送图片 (拍照返回、 相册选取)

选择联系人与短信模版把选择到的内容显示在指定的位置

主界面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center_horizontal"

android:orientation="vertical" >

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:text="短信发送助手"

android:textSize="30sp" />

<RelativeLayout

android:layout_width="match_parent"

android:layout_height="wrap_content" >

<EditText

android:id="@+id/et_contact"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="20sp"

android:hint="请输入联系人" />

<!-- 选择联系人 -->

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:onClick="selectContact"

android:text="+" />

</RelativeLayout>

<EditText

android:id="@+id/et_content"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="20sp"

android:hint="请输入短信内容"

android:minLines="8" />

<Button

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:onClick="selectSms"

android:text="选择短信模版" />

<Button

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:onClick="sendSms"

android:text="发送" />

</LinearLayout>

短信列表

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center_horizontal"

android:orientation="vertical" >

<!--短信列表 -->

<ListView

android:id="@+id/lv_sms"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</ListView>

</LinearLayout>

联系人列表

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center_horizontal"

android:orientation="vertical" >

<!--联系人列表 -->

<ListView

android:id="@+id/lv_contact"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</ListView>

</LinearLayout>


主界面

* 通过选择联系人,与模版把选择到的内容显示在指定的位置

1.建立布局.设置点击事件

2.跳转到选择页面

3.使用ListView展示数据

* 4.为ListView设置OnItemClickListener监听器与事件把选择到的数据返回给请求 Activity

* 5.关闭选择的Activity结束finish() 6

public class MainActivity extends Activity {

* 联系人

private EditText et_contact;

* 内容

private EditText et_content;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

et_contact = (EditText) findViewById(R.id.et_contact);

et_content = (EditText) findViewById(R.id.et_content);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

//判断返回的intent是否为空

if(data==null){

return ;

}

//跟所请求码区别是什么结果

switch (requestCode) {

case 100:

//设置连联系人

et_contact.setText(data.getStringExtra("contact"));

break;

case 200:

//设置内容

et_content.setText(data.getStringExtra("content"));

break;

}

}

* 选择联系人

* @param v

public void selectContact(View v) {

Intent intent = new Intent();

intent.setClass(this, ContactActivity.class);

* requestCode:随意写, 如果一个页面内有多个请求结果的要区分

startActivityForResult(intent, 100);

}

* 选择SMS模版

public void selectSms(View v) {

Intent intent = new Intent();

intent.setClass(this, SmsActivity.class);

* requestCode:随意写, 如果一个页面内有多个请求结果的要区分

startActivityForResult(intent, 200);

}

* 发送SMS

public void sendSms(View v) {

String number = et_contact.getText().toString().trim();

String body = et_content.getText().toString().trim();

if(TextUtils.isEmpty(number) || TextUtils.isEmpty(body)){

Toast.makeText(this, "手机号或者内容不能为空", Toast.LENGTH_SHORT).show();

return ;

}

* 发送短信

SmsManager manager = SmsManager.getDefault();

//拆分短信

ArrayList<String> divideMessage = manager.divideMessage(body);

for (String str : divideMessage) {

manager.sendTextMessage(number, null, str, null, null);

}

}

}

短信列表

/**

* 短信模块列表显示

public class SmsActivity extends Activity {

protected static final String TAG = "SmsActivity";

private ListView lv_sms;

private String [] objects={

"短信模块列表显示内容1",

"短信模块列表显示内容2",

"短信模块列表显示内容3",

"短信模块列表显示内容4",

"短信模块列表显示内容5",

"短信模块列表显示内容6",

"短信模块列表显示内容7",

"短信模块列表显示内容8",

"短信模块列表显示内容9",

"短信模块列表显示内容10",

"短信模块列表显示内容11",

"短信模块列表显示内容12",

"短信模块列表显示内容45",

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_sms_item);

lv_sms = (ListView) findViewById(R.id.lv_sms);

lv_sms = (ListView) findViewById(R.id.lv_sms);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, objects);

//配置监听器

lv_sms.setAdapter(adapter);

//设置监听事件

lv_sms.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

Log.i(TAG, "position:"+position);

Log.i(TAG, "元素:"+objects[position]);

//返回返回resultCode 响应码

Intent intent = new Intent();

//保存传递的数据

intent.putExtra("content", objects[position]);

//调置结果

setResult(200, intent);

//结束

finish();

}

});

}

}

联系人列表

/**

* 联系人列表显示

public class ContactActivity extends Activity {

protected static final String TAG = "ContactActivity";

private ListView lv_contact;

private String [] objects ={

"5556",

"13800138000",

"13800138012",

"13800138023",

"13800138004",

"13800138025",

"13800138306",

"13800138007",

"13800138069",

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_contact_item);

lv_contact = (ListView) findViewById(R.id.lv_contact);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, objects);

//配置监听器

lv_contact.setAdapter(adapter);

//设置监听事件

lv_contact.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

Log.i(TAG, "position:"+position);

Log.i(TAG, "元素:"+objects[position]);

//返回返回resultCode 响应码

Intent intent = new Intent();

//保存传递的数据

intent.putExtra("contact", objects[position]);

//调置结果

setResult(200, intent);

//结束

finish();

}

});

}

}

添加权限

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

6.生命周期

###Activity生命周期

* 生命周期

> 一类从出生到消亡的过程(时间段)

* 生命周期方法

> 对象从创建到销毁,所调用的方法。

* 创建与销毁

> onCreate 和 onDestroy 数据的保存和回显工作

* 可见与不可见

> onStart 和 onStop 可见的时候播放视频,不可见的时候暂停视频的播放

* 获取焦点和失去焦点

> onResume 和 onPause

###生命周期总结

* entire lifetime

> 完整生命周期 onCreate-- onStart-- onResume -- onPause -- onStop -- onDestroy

* visible lifetime

> 可视生命周期 : onStart() -- onResume -- onPause -- onStop

* foreground lifetime

> 前台生命周期: onResume -- onPause

正常的生命周期

一个APP打开到退出

打开最小化,---唤醒-->>退出

/**
* Activity生命周期
*/
public class MainActivity extends AppCompatActivity {

private static final String TAG = "MainActivity";
* 初始化
* @param savedInstanceState
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Log.i(TAG, "======onCreate=======");

}
界面可见时执行

@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "======onStart=======");
}

/*
界面最小化后,再打开时执行
*/
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "======onResume=======");
}

/*
界面最小化
*/
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "======onPause=======");
}

/*
界面不可见
*/
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "======onStop=======");
}
/**
* 退出Activity里执行
*/
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "======onDestroy=======");
}
}

7横竖屏切换:

1. 直接规定了是什么方向显示

android:screenOrientation="landscape" |portrait

2. 不指定方向,横屏就横屏显示,竖屏就竖屏显示

android:configChanges="orientation|screenSize|keyboardHidden"

8任务和栈

* task

> 一个应用程序可以拥有多个界面,一个界面就可以看成是与用户交互的任务 task , 为了方便管理,所以android就使用一个栈来集中管理他们这些任务 , 如果一个应用程序的所有栈都已经清空了,那么这个应用程序也就完全退出了 , 一个应用程序可以拥有多个任务栈

* stack

> 栈 , 是一种数据结构 遵循的是后进先出, 队列 (Queue ) ,先进先出

9.Activity启动模式

* standard

> 这是默认的启动模式,: 启动多少次这个界面,就会有多少个这个界面实例被压入栈中

* singleTop

> 单一顶部模式:如果一个界面的实例已经存在栈顶,那么久不会再继续创建这个界面的实例,而是继续使用这个实例。 只要不是顶部,就与默认的模式一样。

> 场景: 为了避免出现一些奇怪的现象,为了避免让自己启动自己 短信编写界面*

* singleTask

> 单一任务模式:如果一个界面的实例已经存在栈中,那么再次启动就不会继续创建新的实例,而是继续复用它,并且把它与栈顶之间的其他实例全部移除掉。

> 场景: 为了减轻资源的消耗,在栈中值创建一次实例, 比如: 浏览器的界面

* singleInstance

> 全局唯一模式: 无论创建多少次都只有一个实例,并且这个实例放在一个独立的栈中,里面有且只能有它自己一个实例

> 场景: 为了减轻资源的消耗,在栈中值创建一次实例 比如: 通话界面或者紧急通话界面

   
1945 次浏览       19
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
最新活动计划
LLM大模型应用与项目构建 12-26[特惠]
QT应用开发 11-21[线上]
C++高级编程 11-27[北京]
业务建模&领域驱动设计 11-15[北京]
用户研究与用户建模 11-21[北京]
SysML和EA进行系统设计建模 11-28[北京]

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   

Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合

领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...