Android移动开发练习题

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);
    }
}

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值