文章目录
如何创建一个新的activity
Android的四大组件都要在清单文件里进行配置
如果想要让应用有多个启动图标,新建的activity需要配置:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
activity下的label和icon属性可以和application节点的属性不一样,默认用的是application下的属性
一个Android应用一般我们配置一个启动图标就可以了,可以通过其他页面跳转
intent的分类
隐式意图
通过指定的一组动作或数据开启activity
/**
以从MainActivity跳转到TestActivity为例
清单文件
*/
<activity android:name=".TestActivity">
<!-- 意图过滤器 -->
<intent-filter>
<action android:name="com.dsl.testactivity" />
<data
android:mimeType="aa/bb1"
android:scheme="dsl1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
/**
跳转代码
*/
//创建意图对象
Intent intent = new Intent();
//设置跳转的动作
intent.setAction("com.dsl.testactivity");
//设置Category intent.addCategory("android.intent.category.DEFAULT");
//设置数据
// intent.setData(Uri.parse("dsl:"+110));
//设置数据类型
// intent.setType("aa/bb");
//如果setdata和setType一起使用时,应该使用下面的方法
intent.setDataAndType(Uri.parse("dsl1:"+110),"aa/bb1");
//开启意图
startActivity(intent);
显示意图
通过指定具体的包名和类名
Intent intent = new Intent(this,Test2Activity.class);
//设置当前activity的包名和指定activity的类名
// intent.setClassName("com.dsl.newactivity","com.dsl.newactivity.TestActivity");
startActivity(intent);
总结:
开启自己应用的界面用显示意图
开启其他界面(系统应用)用隐式界面‘
显示意图更安全
activity的生命周期
onCreate方法
onDestory方法 当activity销毁的时候调用
onstop方法当activity页面不可见
onstart方法当activity界面变成可视的时候调用
onresume方法 界面有按钮可以被点击了,获取了焦点
onpause方法 界面上按钮不可以被点击了,失去焦点
package com.dsl.activitycycle;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("onCreate");
}
public void click(View v){
Intent intent = new Intent(this, TestActivity.class);
startActivity(intent);
}
//当activity销毁的时候调用
@Override
protected void onDestroy() {
System.out.println("onDestroy");
super.onDestroy();
}
//当activity可见的时候
@Override
protected void onStart() {
super.onStart();
System.out.println("onStart");
}
@Override
protected void onRestart() {
System.out.println("onRestart");
super.onRestart();
}
//界面不可见
@Override
protected void onStop() {
super.onStop();
System.out.println("onStop");
}
//当界面上的按钮可以被点击的时候(可以进行交互)
@Override
protected void onResume() {
System.out.println("onResume");
super.onResume();
}
@Override
protected void onPause() {
System.out.println("onPause");
super.onPause();
}
}
任务栈的概念
打开一个activity叫进栈,关闭一个activity叫出栈
我们操作的activity永远是栈顶的activity
任务栈是用来维护用户操作体验的
应用程序退出了,是任务栈清空了
一般情况下一个应用程序对应一个任务栈
activity的四种启动模式
singleInstance:activity会运行在自己的任务栈里,并且这个任务栈里只有一个实例存在,如果想要保证一个activity在整个手机操作系统里面只有一个实例存在,使用singleInstance
应用场景:来电页面
singleTop:单一顶部模式,如果任务栈的栈顶存在这个要开启的activity,不会重新创建,而是复用之前的,保证栈顶如果存在,不会重新创建
应用场景:浏览器的书签
singleTask:在当前的任务栈里只有一个实例存在,当开启activity的时候,就去检查在任务栈里面是否有实例存在,如果有,就复用这个已经存在的,并且把这个activity上面的所有的别的activity都清空,复用这个已经存在的activity,保证任务栈里只有一个实例存在
应用场景:浏览器的activity
standard:标准模式
intent的案例
人品计算器(显示意图)
/**
MainActivity类:获取用户输入的姓名和性别,并将用户输入的数据传递给指定的activity
*/
package com.dsl.a2_charactercalculator;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
EditText et_name;
RadioGroup rg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_name = findViewById(R.id.et_name);
rg = findViewById(R.id.rg);
}
public void click (View v){
String name = et_name.getText().toString().trim();
if (TextUtils.isEmpty(name)){
Toast.makeText(getApplicationContext(),"亲,请输入你的名字",Toast.LENGTH_SHORT).show();
return;
}
int radioButton = rg.getCheckedRadioButtonId();
int sex = 0;
switch (radioButton) {
case R.id.male:
sex = 1;
break;
case R.id.female:
sex = 2;
break;
case R.id.other:
sex = 3;
break;
}
if (sex == 0){
Toast.makeText(getApplicationContext(),"请选择你的性别",Toast.LENGTH_SHORT).show();
return;
}
//显示意图跳转界面
Intent intent = new Intent(this, ResultActivity.class);
//传递数据
intent.putExtra("name",name);
intent.putExtra("sex",sex);
startActivity(intent);
}
}
/**
ResultActivity:用于随机生成一个人品判断的结果,并显示在控件上
*/
package com.dsl.a2_charactercalculator;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.media.tv.TvView;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.Random;
public class ResultActivity extends AppCompatActivity {
TextView tv_name;
TextView tv_sex;
TextView tv_personality;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
tv_name = findViewById(R.id.tv_name);
tv_sex = findViewById(R.id.tv_sex);
tv_personality = findViewById(R.id.tv_personality);
Intent intent = getIntent();//获取开启此activity的意图对象
//获取传递的值
String name = intent.getStringExtra("name");
int sex = intent.getIntExtra("sex", 0);
tv_name.setText(name);
byte [] bytes = null;
try {
switch (sex){
case 1:
tv_sex.setText("男");
bytes = name.getBytes("utf-8");
break;
case 2:
bytes = name.getBytes("gbk");
tv_sex.setText("女");
break;
case 3:
bytes = name.getBytes("utf-16");
tv_sex.setText("人妖");
break;
}
}catch (Exception e){
e.printStackTrace();
}
int total = 0;
for (byte b :bytes){
int num = b&00101000;
total+=num;
}
int score = Math.abs(total)%100;
System.out.println("score:"+score);
if (score>90){
tv_personality.setText("人品极好,命犯桃花");
}else if(score>70){
tv_personality.setText("人面桃花 会遇到你的。。。");
}else if(score>60){
tv_personality.setText("你的人品才刚刚及格,最近可能有桃花运");
}else{
tv_personality.setText("你要注意了,您的人品不太好,要努力啊");
}
}
}
/**
activity_main 布局
*/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:padding="5dp"
android:hint="请输入你的名字" />
<RadioGroup
android:id="@+id/rg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<RadioButton
android:id="@+id/male"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="男" />
<RadioButton
android:id="@+id/female"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="女" />
<RadioButton
android:id="@+id/other"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="人妖" />
</RadioGroup>
<Button
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="click"
android:text="计算" />
</LinearLayout>
/**
activity_result 布局
*/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ResultActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_name"
android:layout_margin="10dp"
android:padding="5dp"
android:text="张三"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:padding="5dp"
android:id="@+id/tv_sex"
android:text="男"/>
<TextView
android:layout_margin="10dp"
android:padding="5dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/tv_personality"
android:text="你人不错"/>
</LinearLayout>
短信大全(隐式意图)
/**
MainActivity:通过点击我们事先准备好的文字,通过系统自带的短信功能发送信息
*/
package com.dsl.messageAll;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
ListView lv;
String[] obj = {"我喜欢你,喜欢的只是一个现在;我爱你,爱的却是一整个未来。如果是决定离开了一个人,那么你行动是要快一点,快刀斩乱麻;如果决定爱上一个人,时间要拉长一点,看清楚他是否真的适合你。",
"不需要海枯石烂的山盟海誓,只需一生一世的默默相守;不需要多么奢华的烛光晚餐,只需两个人,一桌粗茶淡饭;不需要有座别墅,面朝大海,春暖花开,只需一套小小房子,落地窗,一米阳光。这就是爱,平淡却幸福着;这就是爱,简单并快乐着。",
"心理学家发现:一个人说的话若90%以上是废话,他就快乐。若废话不足50%,快乐感则不足。在交流中,没有太强目的性的语言,更容易让人亲近。----所以,我们每天都在找“幸福”。幸福是什么呢?大概就是找到了一个愿意听你说废话的人。",
"朋友们,在确认她成为你女朋友之前,先带她去游泳吧,有3个好处。1、看身材,没有过多的衣服,藏也藏不住。2、看素颜,在水里,什么遮瑕膏粉底霜,都将不复存在。3、等她学会了游泳,就不会问,你妈和我一起落水,你先救谁的问题了……"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = findViewById(R.id.lv);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, R.layout.item,R.id.tv ,obj);
lv.setAdapter(adapter);
//给item设置点击事件
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String content = obj[position];
Intent intent = new Intent();
//设置action
intent.setAction("android.intent.action.SEND");
//设置category
intent.addCategory("android.intent.category.DEFAULT");
//设置type
intent.setType("text/plain");
//传送数据
intent.putExtra("sms_body",content);
startActivity(intent);
}
});
}
}
/**
item.xml 模板文件
*/
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv"/>
</LinearLayout>
/**
activity_main 文件
*/
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv"/>
</RelativeLayout>
短信发送器案例(模仿短信)
ContactPersonActivity类
通过点击listview中的item获取联系人的电话
package com.dsl.messageSend;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class ContactPersonActivity extends AppCompatActivity {
ListView lv;
List<Person> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contact_person);
lv = findViewById(R.id.lv);
for (int i = 0; i < 20; i++) {
Person person = new Person();
person.setName("张三" + i);
person.setPhone("011" + i);
list.add(person);
}
lv.setAdapter(new MyAdapter());
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String phone = list.get(position).getPhone();
//把数据返回给调用者
Intent intent = new Intent();
intent.putExtra("phone", phone);
//把结果返回给调用者
setResult(10, intent);
//关闭当前页面
finish();
}
});
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
//自定义适配器,用于显示事先准备好的联系人
class MyAdapter extends BaseAdapter {
@Override
public int getCount() {
return list.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;
}
TextView tv_name = view.findViewById(R.id.tv_name);
TextView tv_phone = view.findViewById(R.id.tv_phone);
tv_name.setText(list.get(position).getName());
tv_phone.setText(list.get(position).getPhone());
return view;
}
}
}
activity_contact_person.xml文件
定义listview的布局文件
<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"
tools:context=".ContactPersonActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>
contact_item.xml
定义listview的模板文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="aaa"
android:textSize="20sp" />
<TextView
android:id="@+id/tv_phone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="110"
android:textSize="20sp" />
</LinearLayout>
TemplateActivity类
将事先准备的短信内容,通过点击事件返回给调用者
package com.dsl.messageSend;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class TemplateActivity extends AppCompatActivity {
String obj [] = {"我在吃饭,稍后联系","我在学习,稍后联系","我在谈恋爱,稍后联系","我在敲代码,稍后联系","我在睡觉,稍后联系"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_template);
ListView lv2 = findViewById(R.id.lv2);
ArrayAdapter arrayAdapter = new ArrayAdapter(getApplicationContext(),R.layout.item,R.id.tv,obj);
lv2.setAdapter(arrayAdapter);
lv2.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String content = obj[position];
//把数据返回给调用者
Intent intent = new Intent();
intent.putExtra("content",content);
//返回数据
setResult(20,intent);
finish();
}
});
}
}
activity_template.xml
定义显示短信模板的listview
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
tools:context=".TemplateActivity">
<ListView
android:id="@+id/lv2"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
item.xml
activity_template.xml中list的item条目文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:id="@+id/tv"/>
</LinearLayout>
MainActivity
将获取到的电话和短信模板内容显示到控件上
package com.dsl.messageSend;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
EditText et_num;
EditText et_content;
String number;
String content;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_num = findViewById(R.id.et_num);
et_content = findViewById(R.id.et_content);
}
public void add(View v){
Intent intent = new Intent(this,ContactPersonActivity.class);
// startActivity(intent);
//如果点击按钮开启了另外一个activity,并且当开启的这个activity关闭的时候,我想要这个开启的activity的数据,用下面这个方法
startActivityForResult(intent ,1);
}
//当我们开启的activity页面关闭的时候就调用这个方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
//如果使用请求码也一样
if (resultCode == 10){
//说明数据来自ContactPersonActivity
String phone = data.getStringExtra("phone");
et_num.setText(phone);
}else if(resultCode == 20){
//说明数据来自TemplateActivity
String content = data.getStringExtra("content");
et_content.setText(content);
}
super.onActivityResult(requestCode, resultCode, data);
}
public void insert(View v){
Intent intent = new Intent(this,TemplateActivity.class);
startActivityForResult(intent,2);
}
public void send(View v){
number = et_num.getText().toString().trim();
content = et_content.getText().toString().trim();
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new
String[]{Manifest.permission.SEND_SMS}, 1);
} else {
sengSmS(number,content);
}
}
public void sengSmS(String number,String content){
//获取SmsManager实例
SmsManager smsManager = SmsManager.getDefault();
//将短信分片,以防内容过多
ArrayList<String> strings = smsManager.divideMessage(content);
for (String i :strings){
/**
* 第一个参数:发送给谁
* 第二个参数:服务中心的号码
* 第三个参数:要发送的内容
*/
smsManager.sendTextMessage(number,null,i,null,null);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
sengSmS(number,content);
} else {
Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
activity_main.xml
主界面的展示
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:inputType="phone"
android:id="@+id/et_num"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号码" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/et_num"
android:layout_alignParentRight="true"
android:onClick="add"
android:text="+" />
</RelativeLayout>
<EditText
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/et_content"
android:gravity="top"
android:hint="请输入短信的内容"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入短信模板"
android:onClick="insert"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"
android:onClick="send"/>
</LinearLayout>