ฉันมีแอปพลิเคชั่นอยู่ที่หน้าแรกฉันมีปุ่มสำหรับการนำทางผ่านแอปพลิเคชัน
ในหน้านั้นฉันมีปุ่ม "ออก" ซึ่งเมื่อคลิกควรนำผู้ใช้ไปที่หน้าจอหลักบนโทรศัพท์ที่มีไอคอนแอปพลิเคชันอยู่
ฉันจะทำสิ่งนั้นได้อย่างไร
ฉันมีแอปพลิเคชั่นอยู่ที่หน้าแรกฉันมีปุ่มสำหรับการนำทางผ่านแอปพลิเคชัน
ในหน้านั้นฉันมีปุ่ม "ออก" ซึ่งเมื่อคลิกควรนำผู้ใช้ไปที่หน้าจอหลักบนโทรศัพท์ที่มีไอคอนแอปพลิเคชันอยู่
ฉันจะทำสิ่งนั้นได้อย่างไร
คำตอบ:
การออกแบบของ Android ไม่สนับสนุนการออกจากแอปพลิเคชันโดยทางเลือก แต่เป็นการจัดการโดยระบบปฏิบัติการ คุณสามารถเรียกใช้แอปพลิเคชันหน้าแรกได้ตามความต้องการ
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
อาจจะลองแบบนี้ก็ได้
สมมติว่าในใบสมัครของเราเรามีหลายกิจกรรม (พูดสิบ) และเราจำเป็นต้องออกจากกิจกรรมนี้โดยตรง สิ่งที่เราสามารถทำได้คือสร้างเจตนาและไปที่กิจกรรมรูทและตั้งค่าสถานะในเจตนาเป็น
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
เพิ่มบูลีนพิเศษบางอย่างลงในเจตนาเช่นเดียวกัน
intent.putExtra("EXIT", true);
จากนั้นในกิจกรรมรูทให้ตรวจสอบค่าของboolean
และตามการเสร็จสิ้นการโทรนั้น () ในonCreate()
กิจกรรมรูท
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
onNewIntent
ด้วย เนื่องจาก intnet.getExtras () ยังคงเป็นโมฆะ
RootActivity
แทนที่จะกลับมาทำงานต่อจากสแต็ค ตรวจสอบที่นี่เพื่อเอาชนะstackoverflow.com/a/26258455/609782
System.exit(0);
อาจเป็นสิ่งที่คุณกำลังมองหา มันจะปิดแอปพลิเคชันทั้งหมดและนำคุณไปที่หน้าจอหลัก
มันใช้งานได้ดีสำหรับฉัน
ปิดกิจกรรมก่อนหน้านี้ทั้งหมดดังนี้:
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Exit me", true);
startActivity(intent);
finish();
จากนั้นใน MainActivity onCreate () วิธีการเพิ่มนี้เพื่อเสร็จสิ้นการ MainActivity
setContentView(R.layout.main_layout);
if( getIntent().getBooleanExtra("Exit me", false)){
finish();
return; // add this to prevent from doing unnecessary stuffs
}
เสร็จสิ้นการสมัครของคุณโดยใช้วิธีการ finish();
จากนั้นเพิ่มบรรทัดด้านล่างใน onDestroy สำหรับการลบกำลังปิด
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
super.onDestroy()
หลังจากที่killProcess()
? บรรทัดนี้จะถึงหรือไม่
finish()
หากคุณต้องการที่จะจบกิจกรรมที่คุณก็สามารถโทร อย่างไรก็ตามเป็นวิธีที่ไม่ดีที่จะมีปุ่มออกบนหน้าจอ
บางกิจกรรมคุณไม่ต้องการเปิดอีกครั้งเมื่อกดปุ่มย้อนกลับเช่นกิจกรรมหน้าจอ Splash, กิจกรรมหน้าจอต้อนรับ, Windows ยืนยัน จริงๆแล้วคุณไม่ต้องการสิ่งนี้ในกิจกรรมสแต็ก คุณสามารถทำได้โดยใช้ => เปิดไฟล์ manifest.xml และเพิ่มแอททริบิวต์
หุ่นยนต์: noHistory = "true"
เพื่อกิจกรรมเหล่านี้
<activity
android:name="com.example.shoppingapp.AddNewItems"
android:label=""
android:noHistory="true">
</activity>
หรือ
บางครั้งคุณต้องการปิดแอปพลิเคชันทั้งหมดในการกดปุ่มย้อนกลับ วิธีปฏิบัติที่ดีที่สุดคือเปิดหน้าต่างบ้านแทนที่จะออกจากแอปพลิเคชัน เพื่อที่คุณจะต้องแทนที่ onBackPressed () วิธีการ โดยปกติวิธีการนี้จะเปิดกิจกรรมยอดนิยมในสแต็ก
@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);
}
หรือ
ในปุ่มย้อนกลับกดที่คุณต้องการออกจากกิจกรรมนั้นและคุณยังไม่ต้องการที่จะเพิ่มในกองกิจกรรม วิธีการโทรเสร็จสิ้น () ภายใน onBackPressed () วิธีการ มันจะไม่ปิดแอปพลิเคชันทั้งหมด มันจะไปสำหรับกิจกรรมก่อนหน้าในสแต็ค
@Override
public void onBackPressed() {
finish();
}
(ฉันลองคำตอบก่อนหน้านี้ แต่พวกเขาขาดในบางจุดตัวอย่างเช่นถ้าคุณไม่ทำreturn;
กิจกรรมหลังจากเสร็จสิ้นรหัสกิจกรรมที่เหลือยังทำงานอยู่คุณต้องแก้ไข onCreate ด้วยผลตอบแทนถ้าคุณไม่เรียกใช้ super.onCreate () คุณจะได้รับข้อผิดพลาด runtime)
สมมติว่าคุณมีและMainActivity
ChildActivity
Inside ChildActivity เพิ่มสิ่งนี้:
Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;
ภายใน MainActivity's onCreate เพิ่มสิ่งนี้:
@Override
public void onCreate(Bundle savedInstanceState) {
mContext = getApplicationContext();
super.onCreate(savedInstanceState);
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
return;
}
// your current codes
// your current codes
}
มีตัวเลือกอื่นให้ใช้วิธี FinishAffinity เพื่อปิดงานทั้งหมดในสแต็กที่เกี่ยวข้องกับแอป
เมื่อคุณโทรเสร็จสิ้น onDestroy () ของกิจกรรมนั้นจะถูกเรียกและมันจะกลับไปที่กิจกรรมก่อนหน้าในกิจกรรมสแต็ก ... ดังนั้น .. สำหรับทางออกอย่าโทรเสร็จสิ้น ();
นี่คือสิ่งที่ฉันทำ:
SomeActivity.java
@Override
public void onBackPressed() {
Intent newIntent = new Intent(this,QuitAppActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);
finish();
}
QuitAppActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
finish();
}
โดยทั่วไปสิ่งที่คุณทำคือล้างกิจกรรมทั้งหมดออกจากสแต็กและเรียกใช้QuitAppActivity
ซึ่งจะทำให้งานเสร็จสิ้น
เพิ่มบรรทัดต่อไปนี้หลังจากfinish();
ในonDestroy()
:
android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
ฉันลองออกจากแอปพลิเคชันโดยใช้โค้ดต่อไปนี้มันใช้งานได้สำหรับฉัน หวังว่านี่จะช่วยคุณได้ ฉันสาธิตเล็ก ๆ ด้วย 2 กิจกรรม
กิจกรรมแรก
public class MainActivity extends Activity implements OnClickListener{
private Button secondActivityBtn;
private SharedPreferences pref;
private SharedPreferences.Editor editer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
secondActivityBtn.setOnClickListener(this);
pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
editer = pref.edit();
if(pref.getInt("exitApp", 0) == 1){
editer.putInt("exitApp", 0);
editer.commit();
finish();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.SecondActivityBtn:
Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
startActivity(intent);
break;
default:
break;
}
}
}
กิจกรรมอื่น ๆ ของคุณ
public class YourAnyActivity extends Activity implements OnClickListener {
private Button exitAppBtn;
private SharedPreferences pref;
private SharedPreferences.Editor editer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_any);
exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
exitAppBtn.setOnClickListener(this);
pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
editer = pref.edit();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.exitAppBtn:
Intent main_intent = new Intent(YourAnyActivity.this,
MainActivity.class);
main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(main_intent);
editer.putInt("exitApp",1);
editer.commit();
break;
default:
break;
}
}
}
ฉันทำด้วยโหมดผู้สังเกตการณ์
ส่วนต่อประสานผู้สังเกตการณ์
public interface Observer {
public void update(Subject subject);
}
หัวเรื่องพื้นฐาน
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
observers.remove(observer);
}
protected void notifyObservers(){
for(Observer observer : observers){
observer.update(this);
}
}
}
หัวข้อย่อยใช้วิธีการออก
public class ApplicationSubject extends Subject {
public void exit(){
notifyObservers();
}
}
MyApplication ที่แอปพลิเคชันของคุณควรขยายไว้
public class MyApplication extends Application {
private static ApplicationSubject applicationSubject;
public ApplicationSubject getApplicationSubject() {
if(applicationSubject == null) applicationSubject = new ApplicationSubject();
return applicationSubject;
}
}
กิจกรรมพื้นฐาน
public abstract class BaseActivity extends Activity implements Observer {
public MyApplication app;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
app = (MyApplication) this.getApplication();
app.getApplicationSubject().attach(this);
}
@Override
public void finish() {
// TODO Auto-generated method stub
app.getApplicationSubject().detach(this);
super.finish();
}
/**
* exit the app
*/
public void close() {
app.getApplicationSubject().exit();
};
@Override
public void update(Subject subject) {
// TODO Auto-generated method stub
this.finish();
}
}
มาทดสอบกันเถอะ
public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
close(); //invoke 'close'
}
}
หากคุณต้องการออกจากแอปพลิเคชันให้ใส่รหัสนี้ในฟังก์ชั่นของคุณ
public void yourFunction()
{
finishAffinity();
moveTaskToBack(true);
}
//For an instance, if you want to exit an application on double click of a
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
// do something on back.
From Android 16+ you can use the following:
finishAffinity();
moveTaskToBack(true);
}
return super.onKeyDown(keyCode, event);
}
ทำงานได้ดี 100% นี่คือรหัสสำหรับออกจากแอปของคุณในคลิก (วิธีการ)
Button exit = (Button)findViewById(R.id.exitbutton);
exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();
}
});
คุณสามารถเพิ่มmoveTaskToBack(true)
ปุ่มออกของคุณonClickedListener
เพื่อย่อแอปพลิเคชันให้เล็กที่สุด
หวังว่ามันจะช่วย
บางทีรหัสของฉันสามารถ hepls (Main_Activity.java):
@Override
protected void onDestroy() {
super.onDestroy();
this.finish();
exit(0);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch(keyCode) {
case KeyEvent.KEYCODE_BACK:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
// Go to backgroung
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
});
// Exit from app calling protected void onDestroy()
builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { onDestroy(); }
});
// Close this dialog
builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
});
AlertDialog dialog = builder.create();
dialog.show();
return true;
}
return false;
}
หากคุณต้องการออกจากแอปพลิเคชันของคุณ จากนั้นใช้รหัสนี้ภายในปุ่มเหตุการณ์ของคุณกด ชอบ:
public void onBackPressed()
{
moveTaskToBack(true);
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}