diff --git a/App12/.gitignore b/App12/.gitignore
new file mode 100644
index 0000000..aa724b7
--- /dev/null
+++ b/App12/.gitignore
@@ -0,0 +1,15 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
+local.properties
diff --git a/App12/.idea/.gitignore b/App12/.idea/.gitignore
new file mode 100644
index 0000000..26d3352
--- /dev/null
+++ b/App12/.idea/.gitignore
@@ -0,0 +1,3 @@
+# Default ignored files
+/shelf/
+/workspace.xml
diff --git a/App12/.idea/.name b/App12/.idea/.name
new file mode 100644
index 0000000..9e13355
--- /dev/null
+++ b/App12/.idea/.name
@@ -0,0 +1 @@
+App1
\ No newline at end of file
diff --git a/App12/.idea/compiler.xml b/App12/.idea/compiler.xml
new file mode 100644
index 0000000..b589d56
--- /dev/null
+++ b/App12/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/App12/.idea/deploymentTargetDropDown.xml b/App12/.idea/deploymentTargetDropDown.xml
new file mode 100644
index 0000000..5bef849
--- /dev/null
+++ b/App12/.idea/deploymentTargetDropDown.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/App12/.idea/gradle.xml b/App12/.idea/gradle.xml
new file mode 100644
index 0000000..0897082
--- /dev/null
+++ b/App12/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/App12/.idea/migrations.xml b/App12/.idea/migrations.xml
new file mode 100644
index 0000000..f8051a6
--- /dev/null
+++ b/App12/.idea/migrations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/App12/.idea/misc.xml b/App12/.idea/misc.xml
new file mode 100644
index 0000000..412f4ec
--- /dev/null
+++ b/App12/.idea/misc.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/App12/app/.gitignore b/App12/app/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/App12/app/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/App12/app/build.gradle b/App12/app/build.gradle
new file mode 100644
index 0000000..f72886c
--- /dev/null
+++ b/App12/app/build.gradle
@@ -0,0 +1,42 @@
+plugins {
+ alias(libs.plugins.androidApplication)
+}
+
+android {
+ namespace 'com.example.app1'
+ compileSdk 34
+
+
+ defaultConfig {
+ applicationId "com.example.app1"
+ minSdk 21
+ targetSdk 34
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+
+ implementation libs.appcompat
+ implementation libs.material
+ implementation libs.activity
+ implementation libs.constraintlayout
+ testImplementation libs.junit
+ androidTestImplementation libs.ext.junit
+ androidTestImplementation libs.espresso.core
+
+}
\ No newline at end of file
diff --git a/App12/app/proguard-rules.pro b/App12/app/proguard-rules.pro
new file mode 100644
index 0000000..481bb43
--- /dev/null
+++ b/App12/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/App12/app/src/androidTest/java/com/example/app1/ExampleInstrumentedTest.java b/App12/app/src/androidTest/java/com/example/app1/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..ab2b7db
--- /dev/null
+++ b/App12/app/src/androidTest/java/com/example/app1/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.example.app1;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+ @Test
+ public void useAppContext() {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+ assertEquals("com.example.app1", appContext.getPackageName());
+ }
+}
\ No newline at end of file
diff --git a/App12/app/src/main/AndroidManifest.xml b/App12/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..017abe9
--- /dev/null
+++ b/App12/app/src/main/AndroidManifest.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/App12/app/src/main/java/com/example/app1/DBHelper.java b/App12/app/src/main/java/com/example/app1/DBHelper.java
new file mode 100644
index 0000000..a6f313c
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/DBHelper.java
@@ -0,0 +1,88 @@
+package com.example.app1;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+public class DBHelper extends SQLiteOpenHelper {
+
+ // 数据库名称和版本号
+ private static final String DATABASE_NAME = "user_db";
+ private static final int DATABASE_VERSION = 1;
+
+ // 表名和列名
+ private static final String TABLE_USERS = "users";
+ private static final String COLUMN_ID = "id";
+ private static final String COLUMN_USERNAME = "username";
+ private static final String COLUMN_PASSWORD = "password";
+
+ // 创建用户表的SQL语句
+ private static final String SQL_CREATE_TABLE_USERS =
+ "CREATE TABLE " + TABLE_USERS + " (" +
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
+ COLUMN_USERNAME + " TEXT," +
+ COLUMN_PASSWORD + " TEXT)";
+
+ // 构造方法
+ public DBHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {
+ // 创建用户表
+ db.execSQL(SQL_CREATE_TABLE_USERS);
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
+ // 数据库升级时执行的操作(暂不处理)
+ }
+
+ public List getAllUsers() {
+ List userList = new ArrayList<>();
+ String selectQuery = "SELECT * FROM " + TABLE_USERS;
+
+ SQLiteDatabase db = this.getWritableDatabase();
+ Cursor cursor = db.rawQuery(selectQuery, null);
+
+ // 用于记录已经显示的用户名和密码
+ HashSet displayedUserData = new HashSet<>();
+
+ // 遍历游标,并将数据添加到用户列表中
+ if (cursor.moveToFirst()) {
+ do {
+ // 获取当前游标位置的用户名和密码
+ String username = cursor.getString(cursor.getColumnIndex(COLUMN_USERNAME));
+ String password = cursor.getString(cursor.getColumnIndex(COLUMN_PASSWORD));
+
+ // 生成用户数据字符串,用于检查是否重复
+ String userDataString = username + "_" + password;
+
+ // 如果该用户数据未在之前显示过,则将用户添加到列表中
+ if (!displayedUserData.contains(userDataString)) {
+ User user = new User();
+ user.setId(cursor.getInt(cursor.getColumnIndex(COLUMN_ID)));
+ user.setUsername(username);
+ user.setPassword(password);
+ userList.add(user);
+
+ // 将当前用户数据标记为已显示
+ displayedUserData.add(userDataString);
+ }
+ } while (cursor.moveToNext());
+ }
+
+ // 关闭游标和数据库连接
+ cursor.close();
+ db.close();
+
+ return userList;
+ }
+
+}
diff --git a/App12/app/src/main/java/com/example/app1/IndexActivity.java b/App12/app/src/main/java/com/example/app1/IndexActivity.java
new file mode 100644
index 0000000..98ee048
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/IndexActivity.java
@@ -0,0 +1,82 @@
+package com.example.app1;
+
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.fragment.app.Fragment;
+
+public class IndexActivity extends AppCompatActivity implements View.OnClickListener {
+ private LinearLayout musicLine, findLine, liveLine, personLine;
+ private TextView lastSelectedText;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.index_daohan);
+ init();
+ switchFragment(new musicFragment());
+ setDefaultTextColor(findViewById(R.id.wenzi1)); // 设置默认选中项的文字颜色
+ lastSelectedText = findViewById(R.id.wenzi1);
+ }
+
+ // 初始化布局
+ private void init() {
+ musicLine = findViewById(R.id.gaohan1);
+ musicLine.setOnClickListener(this);
+ findLine = findViewById(R.id.gaohan2);
+ findLine.setOnClickListener(this);
+ liveLine = findViewById(R.id.gaohan3);
+ liveLine.setOnClickListener(this);
+ personLine = findViewById(R.id.gaohan4);
+ personLine.setOnClickListener(this);
+ }
+
+ // 设置默认选中项的文字颜色
+ private void setDefaultTextColor(TextView text) {
+ text.setTextColor(Color.parseColor("#FF4081"));
+ }
+
+ // 设置默认项的文字颜色为默认颜色
+ private void resetTextColor(TextView text) {
+ text.setTextColor(Color.parseColor("#000000"));
+ }
+
+ // 处理点击事件
+ @Override
+ public void onClick(View view) {
+ resetTextColor(lastSelectedText); // 恢复上一个选中项的文字颜色为默认颜色
+ if (view.getId() == R.id.gaohan1) {
+ switchFragment(new musicFragment());
+ lastSelectedText = findViewById(R.id.wenzi1);
+ setDefaultTextColor(lastSelectedText);
+ } else if (view.getId() == R.id.gaohan2) {
+ switchFragment(new findFragment());
+ lastSelectedText = findViewById(R.id.wenzi2);
+ setDefaultTextColor(lastSelectedText);
+ } else if (view.getId() == R.id.gaohan3) {
+ switchFragment(new liveFragment());
+ lastSelectedText = findViewById(R.id.wenzi3);
+ setDefaultTextColor(lastSelectedText);
+ } else if (view.getId() == R.id.gaohan4) {
+ switchFragment(new personFragment());
+ lastSelectedText = findViewById(R.id.wenzi4);
+ setDefaultTextColor(lastSelectedText);
+ }
+ }
+
+ // 切换Fragment
+ private void switchFragment(Fragment fragment) {
+ getSupportFragmentManager().beginTransaction().replace(R.id.gaohan, fragment).commit();
+ }
+
+ // 退出登录
+ public void tuichudenglu(View view) {
+ Intent intent = new Intent(IndexActivity.this, MainActivity.class);
+ startActivity(intent);
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/MainActivity.java b/App12/app/src/main/java/com/example/app1/MainActivity.java
new file mode 100644
index 0000000..38ba6cc
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/MainActivity.java
@@ -0,0 +1,38 @@
+package com.example.app1;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.activity.EdgeToEdge;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+
+public class MainActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ //获取按钮
+ Button button = (Button) findViewById(R.id.button);
+
+ //按钮进行监听
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ //监听按钮,如果点击,就跳转
+ Intent intent = new Intent();
+ //前一个(MainActivity.this)是目前页面,后面一个是要跳转的下一个页面
+
+ intent.setClass(MainActivity.this,MainActivity2.class);
+ startActivity(intent);
+ }
+ });
+
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/MainActivity2.java b/App12/app/src/main/java/com/example/app1/MainActivity2.java
new file mode 100644
index 0000000..844a332
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/MainActivity2.java
@@ -0,0 +1,150 @@
+package com.example.app1;
+
+import android.annotation.SuppressLint;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.View;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.Toast;
+
+import androidx.activity.EdgeToEdge;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+
+import java.util.List;
+
+
+public class MainActivity2 extends AppCompatActivity {
+
+ private EditText username;
+ private EditText password;
+ private Button login,lookButton;
+ private Button startServiceButton;
+ private boolean isServiceRunning = false;
+ private DBHelper dbHelper; // 数据库助手类
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.user_login);
+ //初始化视图
+ username = findViewById(R.id.username);
+ password = findViewById(R.id.password);
+ login = findViewById(R.id.login);
+ startServiceButton = findViewById(R.id.btnStartService);// 开始时间推送服务按钮
+ lookButton = findViewById(R.id.look); // 查看用户数据按钮
+ // 创建通知渠道
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ NotificationChannel channel = new NotificationChannel("channel_id", "Channel Name", NotificationManager.IMPORTANCE_DEFAULT);
+ NotificationManager notificationManager = getSystemService(NotificationManager.class);
+ notificationManager.createNotificationChannel(channel);
+ }
+
+ // 初始化数据库助手类
+ dbHelper = new DBHelper(MainActivity2.this);
+
+ // 启动服务按钮点击事件
+ startServiceButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (!isServiceRunning) {
+ startMyService();
+ isServiceRunning = true;
+ }
+ }
+ });
+
+ // 登录按钮点击事件
+ login.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ String strUsername = username.getText().toString().trim();
+ String strPassword = password.getText().toString().trim();
+
+ // 获取所有用户数据
+ List userList = dbHelper.getAllUsers();
+
+ // 检查是否有用户数据
+ if (!userList.isEmpty()) {
+ // 遍历用户数据列表
+ for (User user : userList) {
+ String savedUsername = user.getUsername();
+ String savedPassword = user.getPassword();
+
+ // 检查用户名和密码是否匹配
+ if (strUsername.equals(savedUsername) && strPassword.equals(savedPassword)) {
+ Toast.makeText(MainActivity2.this, "恭喜,登录成功!", Toast.LENGTH_SHORT).show();
+ Intent intent1 = new Intent(MainActivity2.this, IndexActivity.class);
+ startActivity(intent1);
+ return; // 如果匹配成功,则直接返回,不再继续循环
+ }
+ }
+ // 如果循环结束仍未匹配成功,则提示用户名或密码错误
+ Toast.makeText(MainActivity2.this, "用户名或密码错误!", Toast.LENGTH_SHORT).show();
+ } else {
+ // 如果用户数据列表为空,则提示用户名或密码错误
+ Toast.makeText(MainActivity2.this, "用户名或密码错误!", Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+
+ // 查看用户数据按钮点击事件
+ lookButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ // 获取所有用户数据
+ List userList = dbHelper.getAllUsers();
+
+ // 创建对话框来显示用户数据
+ AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity2.this);
+ builder.setTitle("用户数据");
+
+ // 构建用户数据字符串
+ StringBuilder userData = new StringBuilder();
+ for (User user : userList) {
+ userData.append("ID: ").append(user.getId()).append(", ")
+ .append("用户名: ").append(user.getUsername()).append(", ")
+ .append("密码: ").append(user.getPassword()).append("\n");
+ }
+
+ // 将用户数据设置到对话框中
+ builder.setMessage(userData.toString());
+
+ // 设置对话框的按钮
+ builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {
+ // 点击确定按钮的逻辑
+ dialog.dismiss(); // 关闭对话框
+ }
+ });
+
+ // 创建并显示对话框
+ AlertDialog dialog = builder.create();
+ dialog.show();
+ }
+ });
+ }
+
+ //开始时间推送服务
+ private void startMyService() {
+ Intent serviceIntent = new Intent(this, MyService.class);
+ startService(serviceIntent);
+ }
+
+ //点击注册按钮时,跳转到注册界面
+ public void zhuce(View view) {
+ Intent intent2 = new Intent(MainActivity2.this, MainActivity3.class);
+ startActivity(intent2);
+ }
+}
+
diff --git a/App12/app/src/main/java/com/example/app1/MainActivity3.java b/App12/app/src/main/java/com/example/app1/MainActivity3.java
new file mode 100644
index 0000000..75907d0
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/MainActivity3.java
@@ -0,0 +1,109 @@
+package com.example.app1;
+
+import android.content.ContentValues;
+import android.content.Intent;
+import android.database.sqlite.SQLiteDatabase;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.RadioGroup;
+import android.widget.TextView;
+import android.widget.Toast;
+import androidx.appcompat.app.AppCompatActivity;
+
+public class MainActivity3 extends AppCompatActivity implements View.OnClickListener {
+ private TextView reg_username;
+ private TextView reg_password;
+ private TextView reg_sure_password;
+ private RadioGroup radiogroup;
+ private CheckBox ah1, ah2, ah3, ah4;
+ private String sex = "男";
+ private String aihao1 = "", aihao2 = "", aihao3 = "", aihao4 = "";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.user_register);
+ //初始化
+ reg_username = findViewById(R.id.reg_username);
+ reg_password = findViewById(R.id.reg_password);
+ reg_sure_password = findViewById(R.id.reg_sure_password);
+
+ findViewById(R.id.reg_register).setOnClickListener(this);
+ radiogroup = findViewById(R.id.rp);
+ radiogroup.setOnCheckedChangeListener((group, checkedId) -> {
+ if (checkedId == R.id.man) {
+ sex = "男";
+ } else if (checkedId == R.id.woman) {
+ sex = "女";
+ }
+ });
+
+ ah1 = findViewById(R.id.chang);
+ ah2 = findViewById(R.id.tiao);
+ ah3 = findViewById(R.id.rap);
+ ah4 = findViewById(R.id.basketball);
+ ah1.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ aihao1 = isChecked ? "唱" : "";
+ });
+ ah2.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ aihao2 = isChecked ? "跳" : "";
+ });
+ ah3.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ aihao3 = isChecked ? "rap" : "";
+ });
+ ah4.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ aihao4 = isChecked ? "篮球" : "";
+ });
+ }
+
+ @Override
+ public void onClick(View view) {
+ String username = reg_username.getText().toString().trim();
+ String password = reg_password.getText().toString().trim();
+ String surepassword = reg_sure_password.getText().toString().trim();
+
+ if (username.isEmpty() || password.isEmpty() || surepassword.isEmpty()) {
+ Toast.makeText(MainActivity3.this, "用户名或密码不能为空!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ if (!password.equals(surepassword)) {
+ Toast.makeText(MainActivity3.this, "两次输入密码不一致!", Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ // 保存用户名和密码到数据库
+ DBHelper dbHelper = new DBHelper(MainActivity3.this);
+ SQLiteDatabase db = null;
+ try {
+ db = dbHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put("username", username);
+ values.put("password", password);
+ long result = db.insert("users", null, values);
+ if (result == -1) {
+ Toast.makeText(MainActivity3.this, "注册失败!", Toast.LENGTH_SHORT).show();
+ } else {
+ Toast.makeText(MainActivity3.this, "注册成功!", Toast.LENGTH_SHORT).show();
+ // 如果一切正常,跳转到下一个页面
+ Intent intent1 = new Intent(this, MainActivity2.class);
+ startActivity(intent1);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ Toast.makeText(MainActivity3.this, "注册失败!", Toast.LENGTH_SHORT).show();
+ } finally {
+ if (db != null) {
+ db.close(); // 关闭数据库连接
+ }
+ }
+
+ }
+
+ // 返回按钮点击事件
+ public void fanhui(View view) {
+ Intent intent5 = new Intent(MainActivity3.this, MainActivity2.class);
+ startActivity(intent5);
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/MyService.java b/App12/app/src/main/java/com/example/app1/MyService.java
new file mode 100644
index 0000000..52b2526
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/MyService.java
@@ -0,0 +1,85 @@
+package com.example.app1;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.Handler;
+import android.os.IBinder;
+
+import androidx.core.app.NotificationCompat;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+public class MyService extends Service {
+ private static final int NOTIFICATION_ID = 1;
+ private final IBinder binder = new LocalBinder();
+ private Handler handler;
+ private Runnable runnable;
+
+ public MyService() {
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return binder;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ startForeground(NOTIFICATION_ID, createNotification());
+ handler = new Handler();
+ runnable = new Runnable() {
+ @Override
+ public void run() {
+ showNotification();
+ handler.postDelayed(this, 60 * 1000); // 每隔一分钟发送通知
+ }
+ };
+ handler.post(runnable);
+ return START_STICKY;
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ handler.removeCallbacks(runnable);
+ }
+
+ private void showNotification() {
+ NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ Notification notification = createNotification();
+ notificationManager.notify(NOTIFICATION_ID, notification);
+ }
+
+ private Notification createNotification() {
+ // 获取当前时间
+ SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
+ Date date = new Date(System.currentTimeMillis());
+
+ // 创建通知点击时要启动的意图
+ Intent notificationIntent = new Intent(this, MainActivity2.class);
+ PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
+
+ // 创建通知
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "channel_id")
+ .setContentTitle("提醒系统当前时间")
+ .setContentText("系统当前时间为:" + formatter.format(date)) // 在通知文本中显示当前时间
+ .setSmallIcon(R.drawable.ic_launcher_background)
+ .setContentIntent(pendingIntent)
+ .setPriority(NotificationCompat.PRIORITY_DEFAULT);
+
+ return builder.build();
+ }
+
+ public class LocalBinder extends Binder {
+ MyService getService() {
+ return MyService.this;
+ }
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/PlayMusicActivity.java b/App12/app/src/main/java/com/example/app1/PlayMusicActivity.java
new file mode 100644
index 0000000..365816c
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/PlayMusicActivity.java
@@ -0,0 +1,94 @@
+package com.example.app1;
+
+import android.media.MediaPlayer;
+import android.os.Bundle;
+import android.view.View;
+import android.view.animation.Animation;
+import android.view.animation.AnimationUtils;
+import android.view.animation.LinearInterpolator;
+import android.widget.Button;
+import android.widget.ImageView;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public class PlayMusicActivity extends AppCompatActivity{
+
+ private MediaPlayer mediaPlayer;
+ private Button playButton, pauseButton, stopButton;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_play_music);
+
+ // 初始化旋转的图片并设置动画
+ ImageView iv = findViewById(R.id.rotating_image);
+ Animation animation = AnimationUtils.loadAnimation(this, R.anim.img_animation);
+ LinearInterpolator linearInterpolator = new LinearInterpolator();
+ animation.setInterpolator(linearInterpolator);
+ iv.startAnimation(animation);
+
+ // 创建MediaPlayer并设置音乐资源,启用循环播放,并开始播放音乐
+ mediaPlayer = MediaPlayer.create(this, R.raw.music1);
+ mediaPlayer.setLooping(true);
+ mediaPlayer.start();
+
+ // 初始化按钮并设置点击监听器
+ playButton = findViewById(R.id.play_button);
+ pauseButton = findViewById(R.id.pause_button);
+ stopButton = findViewById(R.id.stop_button);
+
+ playButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ playMusic();
+ }
+ });
+ pauseButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ pauseMusic();
+ }
+ });
+ stopButton.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ stopMusic();
+ }
+ });
+ }
+
+ // 播放音乐
+ private void playMusic() {
+ if (!mediaPlayer.isPlaying()) {
+ mediaPlayer.start();
+ }
+ }
+
+ // 暂停音乐
+ private void pauseMusic() {
+ if (mediaPlayer.isPlaying()) {
+ mediaPlayer.pause();
+ }
+ }
+
+ // 停止音乐
+ private void stopMusic() {
+ mediaPlayer.pause();
+ mediaPlayer.seekTo(0); // 将音乐回到开头
+ }
+
+ // 销毁资源
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mediaPlayer != null) {
+ mediaPlayer.release();
+ mediaPlayer = null;
+ }
+
+ // 清除动画
+ ImageView iv = findViewById(R.id.rotating_image);
+ iv.clearAnimation();
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/User.java b/App12/app/src/main/java/com/example/app1/User.java
new file mode 100644
index 0000000..db594e6
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/User.java
@@ -0,0 +1,45 @@
+package com.example.app1;
+
+// 用户类
+public class User {
+ private int id; // 用户ID
+ private String username; // 用户名
+ private String password; // 密码
+
+ // 默认构造函数
+ public User() {
+
+ }
+
+ // 带参数的构造函数
+ public User(int id, String username, String password) {
+ this.id = id;
+ this.username = username;
+ this.password = password;
+ }
+
+ // Getter 和 Setter 方法
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/findFragment.java b/App12/app/src/main/java/com/example/app1/findFragment.java
new file mode 100644
index 0000000..91df303
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/findFragment.java
@@ -0,0 +1,122 @@
+package com.example.app1;
+
+import android.content.Intent;
+import android.graphics.Color;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import androidx.fragment.app.Fragment;
+
+public class findFragment extends Fragment {
+ private ListView listView;
+ private TextView contentText;
+ private LinearLayout ll2;
+
+ private ListView playlistView;
+ private int lastClickedPosition = -1; // 记录上次点击的位置
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
+ View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_find, container, false);
+ init(view);
+
+ // 默认显示热搜榜内容
+ String[] defaultPlaylist = getPlaylistForItem(0);
+ ArrayAdapter defaultPlaylistAdapter = new ArrayAdapter<>(requireContext(),
+ android.R.layout.simple_list_item_1, defaultPlaylist);
+ playlistView.setAdapter(defaultPlaylistAdapter);
+ return view;
+ }
+
+ private void init(View view) {
+ // 初始化列表和内容显示区域
+ listView = view.findViewById(R.id.list_view);
+ contentText = view.findViewById(R.id.content_text);
+ playlistView = view.findViewById(R.id.playlist_view);
+
+ ll2 = view.findViewById(R.id.ll2);
+
+ ll2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getContext(), PlayMusicActivity.class); // 创建启动本地音乐播放页面的Intent
+ startActivity(intent); // 启动新的Activity
+ }
+ });
+
+
+ // 列表项
+ final String[] listItems = {"热搜榜", "儿童热门榜", "影视热搜", "国风热搜", "外语热搜", "情歌热搜", "纯音乐热搜", "综艺热搜"};
+
+ ArrayAdapter adapter = new ArrayAdapter<>(requireContext(),
+ android.R.layout.simple_list_item_1, listItems);
+ listView.setAdapter(adapter);
+
+ // 默认显示热搜榜项的背景颜色为粉色
+ listView.post(new Runnable() {
+ @Override
+ public void run() {
+ View hotSearchView = listView.getChildAt(0);
+ hotSearchView.setBackgroundColor(Color.parseColor("#FBBCDC")); // 粉色
+ }
+ });
+
+ // 记录上次点击的位置
+ lastClickedPosition = 0;
+
+ // 点击列表项更新内容显示区域的内容和右侧的歌单内容
+ listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ @Override
+ public void onItemClick(AdapterView> parent, View view, int position, long id) {
+ // 恢复上一个点击项的背景颜色
+ if (lastClickedPosition != -1) {
+ View lastClickedView = parent.getChildAt(lastClickedPosition);
+ lastClickedView.setBackgroundColor(Color.TRANSPARENT); // 恢复默认背景色
+ }
+
+ // 获取点击的视图
+ View clickedView = parent.getChildAt(position);
+ // 修改背景颜色为粉色
+ clickedView.setBackgroundColor(Color.parseColor("#FBBCDC")); // 粉色
+ // 更新上次点击的位置
+ lastClickedPosition = position;
+
+ // 更新右侧歌单内容
+ String[] playlist = getPlaylistForItem(position);
+ ArrayAdapter playlistAdapter = new ArrayAdapter<>(requireContext(),
+ android.R.layout.simple_list_item_1, playlist);
+ playlistView.setAdapter(playlistAdapter);
+ }
+ });
+ }
+
+ // 根据位置返回相应的歌单内容
+ private String[] getPlaylistForItem(int position) {
+ switch (position) {
+ case 0:
+ return new String[]{"无名的人", "落", "如果可以","若月亮没有来","梨花香","下辈子早点相遇","如果爱忘了","离别开出花","dadada","别爱太满别睡太晚","我把故事酿成酒","梦驼铃","安河桥","你"};
+ case 1:
+ return new String[]{"贝乐虎儿歌", "宝宝巴士", "睡前故事晚安宝贝","寓言故事","黑猫警长救援队","兔小贝睡前故事","宝宝巴士儿歌","迷你特工队","咕力律动儿歌","冰雪奇缘","海绵宝宝","海底小纵队儿歌","一千零一夜睡前故事","熊出没"};
+ case 2:
+ return new String[]{"与凤行", "花间令", "热辣滚烫","繁花","烈焰","追风者","别对我动心","谢谢你温暖我","南来北往","在暴雪时分","小日子","大理寺少卿游","祈今朝","周处除三害"};
+ case 3:
+ return new String[]{"霜雪千年", "青花瓷", "红昭愿","上春山","卜卦","天下","桃花诺","画心","红尘客栈","年轮","牵丝戏","若梦","赤伶","武家坡"};
+ case 4:
+ return new String[]{"fate", "magnetic", "call of silence","see you again","back seat","swag","love story","repeat","hey oh","sheesh","wake","any song","heaven","doar cu tine"};
+ case 5:
+ return new String[]{"紫荆花盛开", "不如见一面", "悬溺","你冷落我我就放弃你","谁","犯错","你把爱情给了谁","负我不负她","霜雪千年","沉溺","打歌妹","浴室","爱情转移","把回忆拼好给你"};
+ case 6:
+ return new String[]{"daydream", "碧苍战歌", "瞬间的永恒","daylight","windy hill","夜空的寂静","神明无止","误入迷失森林","秋的思念","诀别书","水墨兰亭","城南花已开","summer","引忘川"};
+ case 7:
+ return new String[]{"就是爱你", "谈恋爱", "慢冷","流沙","暖暖","小宇","桃花运","挚友","问","一眼","怎样","想你时风起","我的美丽","分飞"};
+ default:
+ return new String[]{};
+ }
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/liveFragment.java b/App12/app/src/main/java/com/example/app1/liveFragment.java
new file mode 100644
index 0000000..9ed3934
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/liveFragment.java
@@ -0,0 +1,34 @@
+package com.example.app1;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import androidx.fragment.app.Fragment;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import java.util.ArrayList;
+import java.util.List;
+
+public class liveFragment extends Fragment {
+ private RecyclerView horizontalRecyclerView;
+ private LinearLayout ll3;
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_live, container, false);
+
+ ll3 = view.findViewById(R.id.ll3);
+ ll3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getContext(), PlayMusicActivity.class); // 创建启动本地音乐播放页面的Intent
+ startActivity(intent); // 启动新的Activity
+ }
+ });
+ return view;
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/musicFragment.java b/App12/app/src/main/java/com/example/app1/musicFragment.java
new file mode 100644
index 0000000..f39743c
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/musicFragment.java
@@ -0,0 +1,148 @@
+package com.example.app1;
+
+import android.content.Intent;
+import android.media.MediaPlayer;
+import android.net.Uri;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.ImageButton;
+import android.widget.LinearLayout;
+
+import androidx.fragment.app.Fragment;
+
+import java.io.IOException;
+
+public class musicFragment extends Fragment {
+ private ImageButton playButton1, playButton2, playButton3; // 播放按钮
+ private Button button4, button5, button6; // 页面跳转按钮
+ private LinearLayout ll1;
+ private MediaPlayer mediaPlayer; // 媒体播放器
+ private String musicUrl1 = "https://t3.kugou.com/song.html?id=bmzyP1dCNV2"; // 第一首音乐链接
+ private String musicUrl2 = "https://t4.kugou.com/song.html?id=bn05n53CNV2"; // 第二首音乐链接
+ private String musicUrl4 = "https://www.kugou.com/yy/special/index/1-5-0.html"; // 音乐排行榜链接
+ private String musicUrl5 = "https://www.kugou.com/yy/html/rank.html"; // 音乐排行榜链接
+ private String musicUrl6 = "https://www.kugou.com/yy/html/singer.html"; // 歌手页面链接
+
+ // 创建视图并返回
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ View view = inflater.inflate(R.layout.fragment_music, container, false);
+ init(view); // 初始化界面
+ return view;
+ }
+
+ // 初始化界面
+ private void init(View view) {
+ playButton1 = view.findViewById(R.id.ib1);
+ playButton2 = view.findViewById(R.id.ib2);
+ playButton3 = view.findViewById(R.id.ib3);
+
+ button5 = view.findViewById(R.id.phb);
+ button4 = view.findViewById(R.id.tjgd);
+ button6 = view.findViewById(R.id.rmgs);
+
+ ll1 = view.findViewById(R.id.ll1);
+
+ mediaPlayer = new MediaPlayer(); // 初始化媒体播放器
+
+ // 点击第一个播放按钮,播放第一首音乐
+ playButton1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ playMusic(musicUrl1);
+ }
+ });
+
+ // 点击第二个播放按钮,播放第二首音乐
+ playButton2.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ playMusic(musicUrl2);
+ }
+ });
+
+ // 点击本地播放按钮,跳转到本地音乐播放页面
+ playButton3.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ playLocalMusic();
+ }
+ });
+
+ ll1.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(getContext(), PlayMusicActivity.class); // 创建启动本地音乐播放页面的Intent
+ startActivity(intent); // 启动新的Activity
+ }
+ });
+
+ // 点击排行榜按钮,打开音乐排行榜页面
+ button5.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ openRankingPage1();
+ }
+ });
+
+ // 点击推荐歌单按钮,打开推荐歌单页面
+ button4.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ openRankingPage2();
+ }
+ });
+
+ // 点击热门歌手按钮,打开热门歌手页面
+ button6.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ openRankingPage3();
+ }
+ });
+
+ }
+
+ // 播放在线音乐
+ private void playMusic(String musicUrl) {
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(musicUrl)); // 创建打开链接的Intent
+ startActivity(intent); // 启动Intent,打开对应链接
+ }
+
+ // 播放本地音乐
+ private void playLocalMusic() {
+ Intent intent = new Intent(getContext(), PlayMusicActivity.class); // 创建启动本地音乐播放页面的Intent
+ startActivity(intent); // 启动新的Activity
+ }
+
+ // 打开音乐排行榜页面
+ private void openRankingPage1() {
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(musicUrl5)); // 创建打开音乐排行榜链接的Intent
+ startActivity(intent); // 启动Intent,打开对应链接
+ }
+
+ // 打开推荐歌单页面
+ private void openRankingPage2() {
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(musicUrl4)); // 创建打开推荐歌单链接的Intent
+ startActivity(intent); // 启动Intent,打开对应链接
+ }
+
+ // 打开热门歌手页面
+ private void openRankingPage3() {
+ Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(musicUrl6)); // 创建打开热门歌手链接的Intent
+ startActivity(intent); // 启动Intent,打开对应链接
+ }
+
+ // 销毁Fragment时释放媒体播放器资源
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (mediaPlayer != null) {
+ mediaPlayer.release(); // 释放媒体播放器资源
+ mediaPlayer = null;
+ }
+ }
+}
diff --git a/App12/app/src/main/java/com/example/app1/personFragment.java b/App12/app/src/main/java/com/example/app1/personFragment.java
new file mode 100644
index 0000000..3149f00
--- /dev/null
+++ b/App12/app/src/main/java/com/example/app1/personFragment.java
@@ -0,0 +1,155 @@
+package com.example.app1;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.SimpleAdapter;
+import android.widget.TextView;
+
+import androidx.fragment.app.Fragment;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.List;
+
+public class personFragment extends Fragment {
+ private ListView listNew;
+ private TextView clockTextView;
+ private LinearLayout ll4;
+ private final Handler handler = new Handler(Looper.getMainLooper());
+
+ private List