1.请实现以下两个界面,并完成从(a)界面传值跳转到(b)界面的过程。要求是:至少在一个activity里面的主要生命周期函数中,用Log输出一句测试的话,并对Log画面进行截图;对两个Activity传值效果进行截图。请注意:密码框使用*隐藏显示。
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
<!-- MainActivity -->
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:exported="true">
<!-- 设置该activity为应用程序的启动界面 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- SecondActivity -->
<activity
android:name=".SecondActivity"
android:label="@string/second_activity"
android:exported="true">
<!-- 设置该activity为应用程序的第二个界面 -->
<intent-filter>
<action android:name="com.example.myapp.SECOND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java:
package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
// 定义控件变量
private EditText etStuId, etName;
private CheckBox cbChinese, cbMath, cbEnglish;
private Button btnConfirm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化控件变量
etStuId = findViewById(R.id.et_stu_id);
etName = findViewById(R.id.et_name);
cbChinese = findViewById(R.id.cb_chinese);
cbMath = findViewById(R.id.cb_math);
cbEnglish = findViewById(R.id.cb_english);
btnConfirm = findViewById(R.id.btn_confirm);
// 设置按钮点击事件
btnConfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取用户输入的数据
String stuId = etStuId.getText().toString();
String name = etName.getText().toString();
boolean chinese = cbChinese.isChecked();
boolean math = cbMath.isChecked();
boolean english = cbEnglish.isChecked();
// 创建一个Intent对象,用于跳转到第二个界面
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// 将数据放入Intent对象中
intent.putExtra("stuId", stuId);
intent.putExtra("name", name);
intent.putExtra("chinese", chinese);
intent.putExtra("math", math);
intent.putExtra("english", english);
// 启动第二个界面
startActivity(intent);
}
});
}
}
SecondActivity.java:
package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class SecondActivity extends AppCompatActivity {
// 定义控件变量
private TextView tvStuId, tvName, tvSubjects;
private Button btnBack;
// 定义一个常量,用于标记日志信息
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 初始化控件变量
tvStuId = findViewById(R.id.tv_stu_id);
tvName = findViewById(R.id.tv_name);
tvSubjects = findViewById(R.id.tv_subjects);
btnBack = findViewById(R.id.btn_back);
// 获取上一个界面传递过来的Intent对象
Intent intent = getIntent();
// 从Intent对象中获取数据
String stuId = intent.getStringExtra("stuId");
String name = intent.getStringExtra("name");
boolean chinese = intent.getBooleanExtra("chinese", false);
boolean math = intent.getBooleanExtra("math", false);
boolean english = intent.getBooleanExtra("english", false);
// 显示数据到控件上
tvStuId.setText("学号:" + stuId);
tvName.setText("姓名:" + name);
String subjects = "科目:";
if (chinese) {
subjects += "语文 ";
}
if (math) {
subjects += "数学 ";
}
if (english) {
subjects += "英语 ";
}
tvSubjects.setText(subjects);
// 设置按钮点击事件
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 结束当前界面,返回上一个界面
finish();
}
});
Log.d(TAG, "onCreate方法被调用");
}
@Override
protected void onPause() {
super.onPause();
// 输出一句测试的话到Logcat窗口
Log.d(TAG, "onPause方法被调用");
}
@Override
protected void onStop() {
super.onStop();
// 输出一句测试的话到Logcat窗口
Log.d(TAG, "onStop方法被调用");
}
@Override
protected void onDestroy() {
super.onDestroy();
// 输出一句测试的话到Logcat窗口
Log.d(TAG, "onDestroy方法被调用");
}
@Override
protected void onRestart() {
super.onRestart();
// 输出一句测试的话到Logcat窗口
Log.d(TAG, "onRestart方法被调用");
}
}
activity_main.xml:
<?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"
android:orientation="vertical"
android:padding="16dp">
<EditText
android:id="@+id/et_stu_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入学号" />
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入姓名" />
<CheckBox
android:id="@+id/cb_chinese"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="语文" />
<CheckBox
android:id="@+id/cb_math"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="数学" />
<CheckBox
android:id="@+id/cb_english"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="英语" />
<Button
android:id="@+id/btn_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="确定" />
</LinearLayout>
activity_second.xml:
<?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"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tv_stu_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="学号:" />
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:" />
<TextView
android:id="@+id/tv_subjects"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="科目:" />
<Button
android:id="@+id/btn_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="返回" />
</LinearLayout>
2.请编写以下界面,点击删除按钮,启动一个确认Dialog,确认后删除所选记录,返回到第一页。需要在第一个页面的主要生命周期函数中,用Log输出一句测试的话。
主要在点击事件中实现:(其余代码与上一题差不多)
// 设置按钮点击事件
btnConfirm.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建一个AlertDialog.Builder对象
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
// 设置对话框的标题和内容
builder.setMessage("确认删除?");
// 设置对话框的确定按钮和取消按钮
builder.setPositiveButton("确定", (dialog, which) -> {
// 点击确定按钮时,删除已经勾选的选择框
if (cbChinese.isChecked()) {
cbChinese.setVisibility(View.GONE);
}
if (cbMath.isChecked()) {
cbMath.setVisibility(View.GONE);
}
if (cbEnglish.isChecked()) {
cbEnglish.setVisibility(View.GONE);
}
});
builder.setNegativeButton("取消", (dialog, which) -> {
// 点击取消按钮时,不做任何操作
});
// 显示对话框
builder.show();
}
});
3.访问手机通讯录,并用ListView显示出来,列表中显示姓名,电话,点击每条记录,显示一个Dialog,包含姓名,电话和邮件。
在manifest里添加:
<uses-permission android:name="android.permission.READ_CONTACTS" /><!-- 读取联系人 -->
MainActivity:
package com.example.myapplication;
//导入需要的包
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.ContentResolver;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
//定义ListView和数据源
private ListView listView;
private List<String> contactsList = new ArrayList<>();
//定义SharedPreferences和编辑器
private SharedPreferences preferences;
private SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取ListView的实例
listView = (ListView) findViewById(R.id.list_view);
//设置ListView的点击事件监听器
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//获取点击的联系人的信息
String contact = contactsList.get(position);
//分割字符串,获取姓名和电话
String[] info = contact.split("\n");
String name = info[0];
String phone = info[1];
//从SharedPreferences中获取邮件,如果没有,就返回空字符串
String email = preferences.getString(name, "");
//创建一个Dialog,显示姓名,电话和邮件
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("联系人信息");
builder.setMessage("姓名:" + name + "\n电话:" + phone + "\n邮件:" + email);
builder.setPositiveButton("确定", null);
builder.show();
}
});
//获取SharedPreferences的实例,指定文件名和模式
preferences = getSharedPreferences("contacts", MODE_PRIVATE);
//获取编辑器的实例
editor = preferences.edit();
//检查是否有读取联系人的权限,如果没有,就申请
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, 1);
} else {
//如果有权限,就读取联系人并显示在ListView中
readContacts();
}
}
//读取联系人的方法
@SuppressLint("Range")
private void readContacts() {
//创建一个内容解析器
ContentResolver resolver = getContentResolver();
//查询联系人的数据,返回一个游标
Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
//遍历游标,获取每个联系人的姓名,电话和邮件
if (cursor != null) {
while (cursor.moveToNext()) {
//获取联系人的姓名
@SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
//获取联系人的电话
@SuppressLint("Range") String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
//获取联系人的邮件,需要再次查询
String email = "";
//根据联系人的ID查询邮件表
Cursor emailCursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)), null, null);
//如果有邮件,就获取第一个
if (emailCursor != null && emailCursor.moveToFirst()) {
email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
emailCursor.close();
}
//拼接联系人的信息,用换行符分隔
String contact = name + "\n" + phone;
//添加到数据源中
contactsList.add(contact);
//将联系人的姓名和邮件存储到SharedPreferences中
editor.putString(name, email);
editor.apply();
}
cursor.close();
}
//创建一个数组适配器,绑定数据源和ListView
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList);
listView.setAdapter(adapter);
}
//处理权限申请的结果的方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
//如果申请成功,就读取联系人并显示在ListView中
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
readContacts();
} else {
//如果申请失败,就提示用户
Toast.makeText(this, "您拒绝了读取联系人的权限", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
4.在A Activity上点击按钮“播放”,播放一首歌曲,同时显示一条前台通知;点击“停止”按钮,停止播放,同时前台通知消失。(歌名叫song.mp3,放在raw文件夹中)
package com.example.myapplication;
//导入需要的包
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;
public class MainActivity extends AppCompatActivity {
//定义按钮和媒体播放器
private Button playButton;
private Button stopButton;
private MediaPlayer mediaPlayer;
//定义通知相关的常量
private static final String CHANNEL_ID = "music_channel";
private static final int NOTIFICATION_ID = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取按钮的实例
playButton = (Button) findViewById(R.id.play_button);
stopButton = (Button) findViewById(R.id.stop_button);
//设置按钮的点击事件监听器
playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//如果媒体播放器为空,就创建一个,并设置数据源为一首歌曲的资源文件
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.song);
}
//如果媒体播放器没有在播放,就开始播放,并显示一条前台通知
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
showNotification();
}
}
});
stopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//如果媒体播放器不为空,并且在播放,就停止播放,并取消前台通知
if (mediaPlayer != null && mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.release();
mediaPlayer = null;
cancelNotification();
}
}
});
}
//显示前台通知的方法
private void showNotification() {
//创建一个通知管理器
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//如果系统版本大于等于Android 8.0,就创建一个通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "Music Channel", NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(channel);
}
//创建一个通知的构造器
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
//设置通知的图标,标题,内容和优先级
builder.setSmallIcon(R.drawable.ic_launcher_background);
builder.setContentTitle("正在播放音乐");
builder.setContentText("点击进入Main Activity");
builder.setPriority(NotificationCompat.PRIORITY_DEFAULT);
//创建一个意图,用来启动A Activity
Intent intent = new Intent(this, MainActivity.class);
//创建一个延迟意图,用来作为通知的点击事件
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
//设置通知的点击事件
builder.setContentIntent(pendingIntent);
//创建一个通知对象
Notification notification = builder.build();
//使用通知管理器显示通知,并指定一个通知ID
manager.notify(NOTIFICATION_ID, notification);
}
//取消前台通知的方法
private void cancelNotification() {
//创建一个通知管理器
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//使用通知管理器取消通知,根据通知ID
manager.cancel(NOTIFICATION_ID);
}
}