2016-06-07 41 views
3

我有一個簡單的應用程序,用一個單一的TextView顯示來自ACTION_SEND意圖的純文本。我的問題是,每次有一些文本被分享到這個應用程序,一個新的實例被創建。我可以在查看最近的應用程序時看到應用程序的多個實例。我在API 23如何防止從Intent.createChooser()啓動時的應用程序/活動的多個實例?

測試它這是我的代碼:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d("MainActivity.java", "onCreate"); 

     ((TextView) findViewById(R.id.temp_textview)).setText("Share text/links from other apps"); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Intent intent = getIntent(); 
     String action = intent.getAction(); 
     intent.getFlags(); 
     Log.d("onResume - intent: ",intent.toString()); 
     String type = intent.getType(); 
     TextView displayText = (TextView) findViewById(R.id.temp_textview); 

     if (Intent.ACTION_SEND.equals(action) && type!=null) { 
      Log.d("MainActivity.java", "Intent verified"); 
      if ("text/plain".equals(type)) { 
       handleSendText(intent, displayText); 
      } 
     } 
    } 

    void handleSendText(Intent intent, TextView displayText) { 
     String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); 
     Log.d("MainActivity.java", sharedText); 
     if (sharedText != null) { 
      displayText.setText(sharedText); 
     } 
    } 
} 

我試圖與清單中的launchMode擺弄,但沒有一個選項來解決這個問題。

編輯1:

這裏是我的清單文件:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="chaitanya.im.example"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEND" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="text/plain" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

發佈您的清單。 –

回答

1

通常情況下,如果另一個應用程序啓動您Activity(通過ACTION_SEND,例如),您Activity將被髮射到的現有任務其他應用程序因此,如果您使用5個其他應用程序,並且其中每個應用程序都使用ACTION_SEND啓動您的Activity,則您將有5個您的Activity的實例,每個實例都在單獨的任務中。

如果你希望你的Activity本身運行在其自己的任務,而不是在其他應用程序的任務,那麼你需要在<activity>申報清單此Activity指定launchMode="singleTask"。然後,當另一個應用程序啓動您的Activity時,Activity將在單獨的任務中啓動。如果在該任務中已經有Activity的實例運行,那麼Android不會創建Activity的新實例,它只會調用onNewIntent()並將其他應用程序在調用startActivity()時使用的Intent

+0

'launchMode =「singleInstance」'並實現'onNewIntent()'解決了這個問題。但我不明白爲什麼。你可以點亮一下嗎? –

+0

那麼'singleTask'和'singleInstance'之間的唯一區別就在於如果你的'Activity'開始任何其他活動會發生什麼。在'singleTask'情況下,如果你的'Activity'啓動另一個'Activity',默認行爲就是它在你的原始'Activity'之上的同一個任務中啓動。在'singleTask'的情況下,如果你的'Activity'啓動了任何其他'Activity',它將在另一個任務中啓動,這樣你的任務只包含一個'Activity'。那是唯一的區別。如果你的'活動'從未啓動另一個'活動',那麼沒有區別。 –

相關問題