如何启动一次活动的实例?

时间:2018-04-24 11:14:09

标签: android android-activity

我有一个场景。我正在尝试使用我创建的PinActivity锁定我的应用程序。我正在运行一个具有计数器计时器5分钟的服务。如果用户在应用程序中没有活动5分钟。我将向他展示他必须解锁并进入应用程序的PINActivity。我正在推出PINActivity,就像这样:

Intent loginIntent = new Intent(this, PINActivity.class);
loginIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(loginIntent);

因此,当用户回到应用程序并看到PINActivity时,他将解锁并进入应用程序。但是如果用户没有输入PIN并再次离开应用程序理想超过5分钟(注意:我的服务在用户将应用程序带到前台时启动计数器计时器)。我不想在顶部添加相同PINActivity的多个实例。我怎样才能确保顶部只有一个PINActivity

6 个答案:

答案 0 :(得分:3)

在清单

中添加android:launchMode="singleInstance"
 <activity
            android:name=".MainActivity"
            android:launchMode="singleInstance"/>

答案 1 :(得分:1)

在清单中的活动中添加 launchMode =&#34; singleInstance&#34; ,如下所示:

  <activity
   android:launchMode="singleInstance"
   android:name=".MainActivity"
                         ..... />

答案 2 :(得分:1)

您应该使用FLAG_ACTIVITY_SINGLE_TOP。如果堆栈顶部已存在PINActivity的实例,则会阻止Android启动PINActivity

Intent loginIntent = new Intent(this, PINActivity.class);
loginIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP);
startActivity(loginIntent);

请不要像其他人建议的那样尝试使用singleTasksingleInstance等特殊启动模式。这不会给你带来帮助,也会让你的问题复杂化。

您也可以在android:launchMode="singleTop"的清单条目中指定PINActivity。这与FLAG_ACTIVITY_SINGLE_TOP具有相同的效果。

答案 3 :(得分:0)

启动活动时,您可以使用此功能:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="wrap_content"
      android:layout_height="match_parent">

      <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:gravity="center"
       android:layout_centerVertical="true"
       android:background="@drawable/menu_counter"
       android:textAppearance="@style/TextAppearance.AppCompat.Body2"
       android:textColor="#ffffff" />
</RelativeLayout>

如果活动已经存在,那么它将使用相同的实例,否则创建新实例,并且不存在重复。

答案 4 :(得分:0)

您需要在清单中设置launchmode。据我所知,有3个选项可以满足您的需求,但您应该看哪一个更适合您。

  1. singleTop 下一个模式是singleTop。它的行为与标准行为几乎相同,这意味着可以根据需要创建singleTop Activity实例。唯一不同的是,如果在调用者任务中堆栈顶部已经存在具有相同类型的Activity实例,则不会创建任何新的Activity,而是通过onNewIntent()方法将Intent发送到现有的Activity实例。

  2. singleTask 此模式与标准和singleTop完全不同。具有singleTask launchMode的Activity允许在系统中只有一个实例(a.k.a. Singleton)。如果系统中存在一个Activity实例,则整个Task保持实例将移动到顶部,而Intent将通过onNewIntent()方法传递。否则,将创建新的活动并将其放置在适当的任务中。

  3. singleInstance 此模式非常接近singleTask,系统中只能存在单个Activity实例。区别在于Task hold这个Activity只能有一个Activity,singleInstance一个。如果从此类Activity调用另一个Activity,则会自动创建一个新任务以放置该新Activity。同样,如果调用singleInstance活动,则会创建新任务以放置活动。
  4. 在你的活动清单中添加

    android:launchMode="oneOfTheAbove"
    

    它应该是这样的:

    <activity
        android:name=".ui.activities.PINActivity"
        android:launchMode="singleTask"/>
    

答案 5 :(得分:0)

  

在活动标记中的singleInstance的manifest add属性中。

<activity 
    android:launchMode= "singleInstance" />                                 

Click Here