【问题标题】:How to finish current activity in Android如何在 Android 中完成当前活动
【发布时间】:2011-06-27 09:53:42
【问题描述】:

我有一个 Android 应用程序。我正在制作一个带有进度条的加载屏幕。

我在 onCreate 方法中输入了延迟。当计时器结束时,我想完成当前活动并开始一个新活动。

它只是在调用finish() 方法时给了我一个异常。

public class LoadingScreen extends Activity{
    private LoadingScreen loadingScreen;
    Intent i = new Intent(this, HomeScreen.class);
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loading);

        CountDownTimer timer = new CountDownTimer(10000, 1000) //10 second Timer
        {
            public void onTick(long l) 
            {

            }

            @Override
            public void onFinish() 
            {
                loadingScreen.finishActivity(0);
                startActivity(i);
            };
        }.start();
    }
}

如何更改代码以在进度条完成时结束?

【问题讨论】:

    标签: android activity-finish


    【解决方案1】:

    如果您正在执行加载屏幕,只需将参数设置为不将其保留在活动堆栈中。在 manifest.xml 中,您定义您的活动:

    <activity android:name=".LoadingScreen" android:noHistory="true" ... />
    

    并且在您的代码中不再需要调用 .finish() 了。只需执行 startActivity(i);

    也无需将当前活动的实例保存在单独的字段中。您始终可以像 LoadingScreen.this.doSomething() 而不是 private LoadingScreen loadingScreen; 那样访问它

    【讨论】:

    • 使用此参数它会以 startActivity 和 startActivityForResult 结束活动。今天它咬我;D
    • noHistoryfinish() 不同
    【解决方案2】:

    我尝试使用此示例,但失败得很惨。每次我在处理程序中调用finish()/finishactivity() 时,都会得到这个威胁性的java.lang.IllegalAccess Exception。我不确定它对提出问题的人是如何工作的。

    相反,我找到的解决方案是在您的活动中创建一个方法,例如

    void kill_activity()
    { 
        finish();
    }
    

    从处理程序的 run 方法中调用此方法。这对我来说就像一个魅力。希望这可以帮助任何为“如何从不同的线程关闭活动?”而苦苦挣扎的人。

    【讨论】:

      【解决方案3】:

      您需要从 UI 线程而不是后台线程调用 finish()。这样做的方法是声明一个 Handler 并要求 Handler 在 UI 线程上运行一个 Runnable。例如:

      public class LoadingScreen extends Activity{
          private LoadingScreen loadingScreen;
          Intent i = new Intent(this, HomeScreen.class);
          Handler handler;
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              handler = new Handler();
              setContentView(R.layout.loading);
      
              CountDownTimer timer = new CountDownTimer(10000, 1000) //10seceonds Timer
              {
                   @Override
                   public void onTick(long l) 
                   {
      
                   }
      
                   @Override
                   public void onFinish() 
                   {
                       handler.post(new Runnable() {
                           public void run() {
                               loadingScreen.finishActivity(0);
                               startActivity(i);
                           }
                       });
                   };
              }.start();
          }
      }
      

      【讨论】:

      • @AndreiBuneyeu - 有一条一般规则(声明为here):“不要从 UI 线程外部访问 Android UI 工具包”。虽然“Android UI 工具包”一词在文档中的任何地方都没有定义(我可以找到),但将活动生命周期方法视为其中的一部分似乎是合理的。 (很明显,一些Activity 方法——比如Activity.runOnUiThread(Runnable)——不属于这个限制。我同意你的观点,文档在这个主题上并不像他们需要的那样清楚。)
      【解决方案4】:

      当您想开始一项新活动并完成当前活动时,您可以这样做:

      API 11 或更高版本

      Intent intent = new Intent(OldActivity.this, NewActivity.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
      startActivity(intent);
      

      API 10 或更低

      Intent intent = new Intent(OldActivity.this, NewActivity.class);
      intent.setFlags(IntentCompat.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
      startActivity(intent);
      

      我希望这可以帮助某人=)

      【讨论】:

        【解决方案5】:

        只需调用finish() 方法:

        context.finish();
        

        【讨论】:

        • 什么完成方法?我在活动中没有看到任何 this.finish() 方法
        【解决方案6】:

        我正在做的是开始一个新活动,然后关闭当前活动。所以,记住这个简单的规则:

        finish()
        startActivity<...>()
        

        而不是

        startActivity<...>()
        finish()
        

        【讨论】:

          【解决方案7】:

          我找到了很多答案,但没有一个是简单的... 我希望这会对你有所帮助...

          try{
              Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
              startActivity(intent);
          } finally {
              finish();
          }
          

          所以, 这里的逻辑非常简单,因为我们知道在 java 中,我们编写的代码在 try 块中可能会出现异常,并在 catch 块中处理该异常,但在 finally 块中我们编写的代码必须以任何代价执行(无论是有没有例外)。

          【讨论】:

            【解决方案8】:

            您也可以使用:finishAffinity()

            在当前任务中完成此活动以及紧接其下的所有具有相同亲和力的活动。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多