day06
1 如何创建一个新的Activity
[1]Android的四大组件都要在清单文件里面配置
[2]如果你想让你的应用有多个启动图标,你的Activity需要配置 如下
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
[3]Activity下的lable和icon属性可以和Application节点的属性不一样 默认用Application节点下的属性
[4]一个Android应用一般配置一个启动图片就可以 看见的其他页面都是从第一个页面跳转过去的
2 隐式意图
定义:通过制定一组动作或者数据
// [1]创建意图对象 意图就是我要完成一件事
Intent intent = new Intent();
// [2]设置跳转的动作
intent.setAction("com.phone.testactivity");
// [3]设置category
intent.addCategory("android.intent.category.DEFAULT");
// [4]设置数据类型
// intent.setType("aa/bb");
// [5]设置数据
// intent.setData(Uri.parse("phone:" + 110));
// [6]注意小细节☆如果setdata方法和settype方法一起使用的时候 应该使用下面这个方法
intent.setDataAndType(Uri.parse("phone:" + 110), "aa/bb");
// [7]开启Activity 记得加权限
startActivity(intent);
3 显示意图
定义:通过指定具体的包名和类名
// [1]创建意图对象 意图就是我要完成一件事
Intent intent = new Intent(this, Test3Activity.class);
// [2]设置包名和类名
// intent.setClassName("com.phone.newacitivity",
// "com.phone.newacitivity.Test3Activity");
// [4]开启Activity 记得加权限
startActivity(intent);
总结:[1]开启自己应用的界面用显示意图
[2]开启其他应用(系统应用)的时候用隐士意图
[3]显示意图安全一些
4 人品计算器小案例
package com.phone.rpcalc;
import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText et_name;
private RadioGroup rg_group;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = (EditText) findViewById(R.id.et_name);
rg_group = (RadioGroup) findViewById(R.id.radioGroup1);
}
// 点击按钮 实现计算人品 跳转到ResultActivity页面
public void click(View v) {
// [1]获取用户名
String name = et_name.getText().toString().trim();
// [2]判断一下name是否为空
if (TextUtils.isEmpty(name)) {
Toast.makeText(getApplicationContext(), "亲,请输入姓名", 1).show();
return;
}
// [3]判断用户选择的性别
int radioButtonId = rg_group.getCheckedRadioButtonId();
int sex = 0;
switch (radioButtonId) {
// 代表选择的是男
case R.id.rb_male:
sex = 1;
break;
// 代表选择的是女
case R.id.rb_female:
sex = 2;
break;
// 代表选择的是人妖
case R.id.rb_other:
sex = 3;
break;
}
if(sex == 0){
Toast.makeText(getApplicationContext(), "请选择性别", 1).show();
return;
}
//[4]跳转到ResultActivity页面 用显示意图 跳转
Intent intent = new Intent(this,ResultActivity.class);
//传递姓名
intent.putExtra("name", name );
//传递性别
intent.putExtra("sex", sex);
startActivity(intent);
}
}
package com.phone.rpcalc;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
public class ResultActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// [1]加载布局
setContentView(R.layout.activity_result);
TextView tv_name = (TextView) findViewById(R.id.tv_name);
TextView tv_sex = (TextView) findViewById(R.id.tv_sex);
TextView tv_result = (TextView) findViewById(R.id.tv_result);
// [2]获取mainActivity传递过来的数据
// 获取开启此Activity的意图对象
Intent intent = getIntent();
// [3]获取name和sex的值
// 小技巧:传递的是什么数据类型 这边就按照传递的数据类型取
String name = intent.getStringExtra("name");
int sex = intent.getIntExtra("sex", 0);
// [4]根据name和sex显示数据
tv_name.setText(name);
byte[] bytes = null;
// [5]显示性别
try {
switch (sex) {
case 1:
tv_sex.setText("男");
bytes = name.getBytes("gbk");
break;
case 2:
tv_sex.setText("女");
bytes = name.getBytes("utf-8");
break;
case 3:
tv_sex.setText("人妖");
bytes = name.getBytes("iso-8859-1");
break;
default:
break;
}
} catch (Exception e) {
e.printStackTrace();
}
// [6]计算人品结果 市面上大多数应用采用的是随机数
int total = 0;
for (byte b : bytes) {
int number = b & 0xff;
total += number;
}
// 获取得分
int score = Math.abs(total) % 100;
if (score > 90) {
tv_result.setText("您的人品非常好,您家的祖坟都冒青烟啦");
} else if (score > 80) {
tv_result.setText("您的人品还可以");
} else if (score > 60) {
tv_result.setText("您的人品刚好及格");
} else {
tv_result.setText("您的人品太次了,您需要努力呀");
}
}
}
5 短信大全小案例
String objects[] = {"今天的风儿轻柔无比,今天的花儿香飘万里;今天的鸟儿十分欢喜,今天的云儿满载笑意;今天的事儿万分顺利,今天的人儿如此甜蜜。所有美...",
"丫头,生活是你自己的,你哭它就对你哭,你笑它就对你笑。转眼,又是一年,你的生日即将来到。今年,还是少不了我对你的祝福,我忍不住...",
"世界上最动听的声音,是妈妈声声的呼唤;世界上最温暖的笑容,是妈妈温暖的笑脸。妈妈,原谅生日时我不能陪在您身边,在这个日子里,我...",
"今天是你的生日,祝你:发财势头如快马加鞭,一日千里;发展速度如滔滔江水,势不可挡;好事发生如雨后春笋,络绎不绝;祝福发送如比赛...",
"茫茫人海相逢是缘分,芸芸众生相知是福气,年年月月相交是情谊。高山流水知音难求,你我手足兄弟情深。巴山夜雨,飘洒我的思念。剪烛西..."};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//[1]找到控件
ListView lv = (ListView) findViewById(R.id.lv);
//[2]设置数据 先有数据
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item,objects);
//[3]设置数据适配器
lv.setAdapter(adapter);
//[4]给listview设置点击事件
lv.setOnItemClickListener(new OnItemClickListener() {
//当listview的一个条目被点击的时候调用
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//[5]把点击条目的数据取出来 掌握一条原则:数据在哪里存着就去哪里去
String content = objects[position];
//[6]跳转到发送短信页面
// <intent-filter>
// <action android:name="android.intent.action.SEND" />
// <category android:name="android.intent.category.DEFAULT" />
// <data android:mimeType="text/plain" />
// </intent-filter>
Intent intent = new Intent();
//设置action
intent.setAction("android.intent.action.SEND");
//设置category
intent.addCategory("android.intent.category.DEFAULT");
//设置mimeType
intent.setType("text/plain");
//传递数据
intent.putExtra("sms_body", content);
//[7]跳转到发送短信页面
startActivity(intent);
}
});
}
6 短信发送器小案例
package com.phone.smssend;
import java.util.ArrayList;
import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText et_number;
private EditText et_content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_content = (EditText) findViewById(R.id.et_content);
et_number = (EditText) findViewById(R.id.et_number);
}
// 点击按钮 跳转到ContactActivity页面
public void click(View v) {
Intent intent = new Intent(this, ContactActivity.class);
// startActivity(intent);
// 小细节 如果点击按钮开启了另外一Activity 并且当开启的这个Activity关闭的时候 想要这个开启Activity的数据
// 用下面这个方法开启Activity
startActivityForResult(intent, 1);
}
// 当我们开启的Activity页面关闭的时候这个方法被调用
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
if (arg0 == 1 && arg1 == 10) {
String phone = arg2.getStringExtra("phone");
et_number.setText(phone);
}
if (arg0 == 2 && arg1 == 20) {
String template = arg2.getStringExtra("template");
et_content.setText(template);
}
super.onActivityResult(arg0, arg1, arg2);
}
// 点击按钮 插入模板
public void insert(View v) {
Intent intent = new Intent(this, SmstemplateActivity.class);
startActivityForResult(intent, 2);
}
// 点击按钮 发送短信
public void send(View v) {
// [1]获取发送短信的号码和内容
String number = et_number.getText().toString().trim();
String content = et_content.getText().toString().trim();
// [2]获取smsmanager实例
SmsManager smsManager = SmsManager.getDefault();
ArrayList<String> divideMessage = smsManager.divideMessage(content);
for (String msm : divideMessage) {
/**
* destinationAddress 发送给谁
* scAddress 服务中心号码
* text 要发送的内容
* sentIntent 广播,发送成功的一个意图
* deliveryIntent 广播,发送失败的一个意图
*/
smsManager.sendTextMessage(number, null, msm, null, null);
}
}
}
package com.phone.smssend;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class ContactActivity extends Activity {
private List<Person> lists;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 加载布局
setContentView(R.layout.activity_contact);
//[1]找到控件
ListView lv = (ListView) findViewById(R.id.lv);
//[2]准备listview要显示的数据 模拟数据
lists = new ArrayList<Person>();
for (int i = 0; i < 50; i++) {
Person person = new Person();
person.setName("张三" + i);
person.setPhone("11" + i);
lists.add(person);
}
//[3]展示数据
lv.setAdapter(new MyAdapter());
//[4]给listview设置点击事件
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//[5]获取点中的条目的数据
String phone = lists.get(position).getPhone();
//[6]把phone 返回给mainActivity
//把数据返回给调用者
Intent intent = new Intent();
intent.putExtra("phone", phone);
//把结果返回给调用者
setResult(10, intent);
//关闭当前页面
finish();
}
});
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return lists.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
view = View.inflate(getApplicationContext(), R.layout.contact_item, null);
}else{
view = convertView;
}
//[1]找到在item中定义的控件用来显示数据
TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
//[2]展示数据
tv_name.setText(lists.get(position).getName());
tv_phone.setText(lists.get(position).getPhone());
return view;
}
}
}
package com.phone.smssend;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class SmstemplateActivity extends Activity {
private String lists[];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_smstemplate);
ListView lv = (ListView) findViewById(R.id.lv);
//[2]准备listview要显示的数据 模拟数据
lists = new String[] {"清晨起床问早安,愿你精神放松一整天,压力见你绕身跑,同事相处和睦伴,吃好喝好润心田,加强锻炼身体健,祝你每天好心情,快乐每一天",
" 早晨的霞光灿烂无比,早晨的露珠晶莹无比,早晨的鲜花美丽无比,早晨的空气新鲜无比,早晨的情绪舒畅无比。愿我最亲爱的朋友,早安快乐!",
" 每一天醒来告诉自己:理由少一点,肚量大一点,嘴巴甜一点,脾气小一点,行动快一点,效率高一点,微笑露一点,脑筋活一点。美好一天的开始,道声:“早安快乐!”",
" 人生的每一次付出就像在山谷当中的喊声,你没有必要期望要谁听到,但那延绵悠远的回音,就是生活对你最好的回报。新的一天新的开始,早安!",
"当第一线光明照彻天际,当第一缕阳光洒满人间,当第一丝清风拂过脸颊,当第一曲铃声悠然响起,那是我的祝福早早来到,愿你拥有一天好心情。早安!"};
//[3]展示数据
lv.setAdapter(new MyAdapter());
//[4]给listview设置点击事件
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//[5]获取点中的条目的数据
String template = lists[position];
//[6]把phone 返回给mainActivity
//把数据返回给调用者
Intent intent = new Intent();
intent.putExtra("template", template);
//把结果返回给调用者
setResult(20, intent);
//关闭当前页面
finish();
}
});
}
private class MyAdapter extends BaseAdapter{
@Override
public int getCount() {
return lists.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
view = View.inflate(getApplicationContext(), R.layout.smstemplate_item, null);
}else{
view = convertView;
}
//[1]找到在item中定义的控件用来显示数据
TextView tv_name = (TextView) view.findViewById(R.id.tv_mess);
//[2]展示数据
tv_name.setText(lists[position]);
return view;
}
}
}
7 Activity的生命周期
[1]onCreate方法
[2]ondestroy方法 当Activity销毁时调用
[3]onStart方法 当Activity界面变成可视的时候调用
[4]onStop方法 当Activity界面变成不可视的时候调用
[5]onResume方法 界面(有按钮)可以被点击了 获取了焦点(可以交互)
[6]onPause方法 界面上(按钮)不可以被点击了 失去了焦点(不可以交互)
[7]]onRestart方法 当Activity界面再次变成可视的时候调用
8 横竖屏切换Activity的生命周期
ctrl + F11
android:screenOrientation="portrait" 代表竖屏
android:screenOrientation="landscape" 代表横屏
9 任务栈的概念
栈:先进后出
队列:先进先出
task 任务
[1]打开一个Activity叫进栈
[2]关闭一个Activity叫出栈
[3]我们操作的Activity永远是栈顶的Activity
[4]任务栈是用来维护用户操作体验的
[5]应用程序退出了也就是任务栈清空了
[6]一般情况一个应用程序对应一个任务栈
10 Acitivity的四种启动模式
android:launchMode="standard" 标准模式
android:launchMode="singleTop" 单一顶部模式 如果任务栈的栈顶存在这个要开启Activity,不会重新的创建activity,而是复用已经存在的activity.保证栈顶如果存在,不会重复创建 。应用场景:浏览器的书签
android:launchMode="singleTask" 单一任务栈 当开启activity的时候,就去检查在任务栈里面是否有实例已经存在,如果有实例存在就复用这个已经存在的activity,并且把这个activity上面的所有的别的activity都清空,复用这个已经存在的activity。保证整个任务栈里面只有一个实例存在。应用场景:浏览器的activity 如果一个activity的创建需要占用大量的系统资源(cpu,内存)一般配置这个activity为singletask的启动模式
android:launchMode="singleInstance" 该启动模式非常特殊,activity会运行在自己的任务栈里面,并且这个任务栈里面只有一个实例存在 如果你要保证一个activity在整个手机操作系统里面只有一个实例存在,使用singleInstance. 应用场景:来电页面
只言片语任我说,提笔句句无需忖。落笔不知寄何人,唯有邀友共斟酌。