我如何让android停止跳过主要活动并保持功能正常工作



我正在练习安卓工作室,但我被这部分卡住了。我构建的这个小应用程序有两个屏幕,第一个屏幕有一条欢迎消息和一个按钮,点击后会将用户发送到第二个屏幕(第二个活动(。第二个屏幕有四个按钮,每个按钮都标有一个值(1到4(。当按下按钮时,它们的值被添加到整数值的ArrayList中,然后这些值被发送回主活动,如果它们匹配正确的顺序和大小,主屏幕上的消息就会改变。我设法做到了,除了在顺序部分匹配正确的数字。我现在的问题是,我的应用程序在启动时跳过主活动,直接进入第二个活动。当数组列表被发送回主活动,并且我返回到第二个活动中输入一个新的组合并返回到主活动时,没有任何变化。我如何修复活动跳过,并能够在两个活动之间来回循环,并根据活动二发生的情况不断更新?

以下是MainActivity类代码

package com.example.securityapp;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ArrayList<Integer> passcode = new ArrayList<Integer>(4);
TextView mainMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
passcode.add(1);
mainMessage = findViewById(R.id.main_message);
final ActivityResultLauncher<Intent> activityResultLauncher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if(result.getResultCode() == RESULT_OK) {
Intent data = result.getData();
Bundle extras = data.getExtras();
if(extras.getIntegerArrayList("keys").size() == 4) {
mainMessage.setText("Welcome to the App! The App is UNLOCKED!");
}
else {
mainMessage.setText("Welcome to the App! The App is LOCKED!");
}
}
}
}
);
Intent intent = new Intent(MainActivity.this , AccessControlActivity.class);
activityResultLauncher.launch(intent);
}
/** Called when user taps the Unlock button */
public void unlockApp(View view) {
Intent intent = new Intent(this, AccessControlActivity.class);
intent.putExtra("key", passcode);
startActivity(intent);
}
}

主活动的XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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" >
<Button
android:id="@+id/btn_unlock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="308dp"
android:onClick="unlockApp"
android:text="@string/btn_unlock"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent" />
<TextView
android:id="@+id/main_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:text="@string/main_message"
android:textAlignment="center"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@+id/btn_unlock"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.949" />
</androidx.constraintlayout.widget.ConstraintLayout>

第二个活动(访问控制活动(

package com.example.securityapp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Arrays;
public class AccessControlActivity extends AppCompatActivity {
private static final int[] numbers = {R.id.key_1, R.id.key_2, R.id.key_3, R.id.key_4};
private static int[] passcode = new int[4];
private Button[] button = new Button[numbers.length];
ArrayList<Integer> numbersList = new ArrayList<Integer>();
Button submit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_access_control);
TextView textView = findViewById(R.id.textView2);
submit = findViewById(R.id.btn_submit);
for(int i = 0; i < numbers.length; i++) {
button[i] = (Button) findViewById(numbers[i]);
button[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.key_1:
Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_SHORT).show();
numbersList.add(1);
break;
case R.id.key_2:
Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_SHORT).show();
numbersList.add(2);
break;
case R.id.key_3:
Toast.makeText(getApplicationContext(), "3", Toast.LENGTH_SHORT).show();
numbersList.add(3);
break;
case R.id.key_4:
Toast.makeText(getApplicationContext(), "4", Toast.LENGTH_SHORT).show();
numbersList.add(4);
break;
}
textView.setText(String.valueOf(numbersList));
}
});
}
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent keycode = new Intent(AccessControlActivity.this, MainActivity.class);
keycode.putExtra("keys", numbersList);
setResult(RESULT_OK, keycode);
finish();
}
});
}
}

访问控制活动的XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".AccessControlActivity">
<Button
android:id="@+id/key_3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/key_3"
app:layout_constraintBaseline_toBaselineOf="@+id/key_2"
app:layout_constraintEnd_toStartOf="@+id/key_4"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/key_2" />
<Button
android:id="@+id/key_1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="312dp"
android:text="@string/key_1"
app:layout_constraintEnd_toStartOf="@+id/key_2"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn_submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:onClick="onSubmit"
android:text="@string/btn_submit"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/key_3"
app:layout_constraintVertical_bias="0.042" />
<Button
android:id="@+id/key_4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:text="@string/key_4"
app:layout_constraintBaseline_toBaselineOf="@+id/key_3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/key_3" />
<Button
android:id="@+id/key_2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="@string/key_2"
app:layout_constraintBaseline_toBaselineOf="@+id/key_1"
app:layout_constraintEnd_toStartOf="@+id/key_3"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/key_1" />
<TextView
android:id="@+id/key_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:text="@string/key_message"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintBottom_toTopOf="@+id/key_3"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.922" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pass_key"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="526dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

启动应用程序的活动在android清单中声明。例如,在这个代码片段中,启动器活动将是我的启动活动。

<activity
android:name=".feature.planes.PlanDetailActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.Matatapp" />
<activity
android:name=".feature.splash.SplashActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.Matatapp">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

但这似乎不是你的问题。您当前正在从onCreate方法启动一个意向,因此即使您将MainActivity设置为启动器,当您的应用程序启动MainActivity并通过onCreate时,它也会很快启动AccessActivity,您甚至不会注意到。要测试MainActivity是否首先启动,只需运行您的应用程序,然后以本机方式返回。如果显示了MainActivity,那么您就知道您的问题是,当用户触发某个东西时,您必须从另一个方法启动您的意图。

我热切地建议您看看主动性生命周期。

最新更新