2012-04-21 40 views
1

是否有使用意向過濾器在外部應用程序中啓動活動是否有區別(並且有一種首選方法)?

Intent myIntent = new Intent("com.this.that.MYACT"); 
myIntent.setPackage("com.this.that"); 

Intent myIntent = new Intent(context, MyActivity.class); 
myIntent.setPackage("com.this.that"); 

之間的功能差異是這些

  • 一個更安全嗎?
  • 更快?
  • 其他一些優點?

還是沒有差別呢?

TIA

+0

我想在安全性和牢度方面應該沒有任何區別。可能是前者可以從外部應用程序調用,後來只能通過相同的應用程序類。只是猜測。 – Javanator 2012-04-21 07:04:48

+0

不,我在兩種情況下都測試了它們,並沒有看到行爲上的任何差異。他們完全可以互換,這不是不可能的,我只是好奇,如果我忽略了一些東西。 – 2012-04-21 07:06:39

+0

同意。我想我們只是有兩種不同的方式來創建相同的意圖對象 – Javanator 2012-04-21 07:07:59

回答

1

答案是:使用任何Intent結構「外部應用程序」的作者告訴你使用,或PackageManager使用getLaunchIntentForPackage()得到一個Intent適合一般啓動「外部應用程序」 。

我已經在兩種情況下測試了它們,並且沒有看到行爲上的差異。

這只是因爲com.this.that.MyActivity碰巧有一個<intent-filter>或已明確標記自己被導出。默認情況下,不會導出活動,也不會使用Intent從第三方應用程序啓動它們。

此外,您的代碼甚至不會編譯,因爲MyActivity不在您的項目中(它位於「外部應用程序」中),因此MyActivity.class不存在。如果您的應用程序和「外部應用程序」恰好在同一個Java包中具有相同的活動類,那麼它將編譯(併成功工作)的唯一方式是,這不太可能。

更安全嗎?

「外部應用程序」的作者應該使用Intent動作(您的第一個場景),因爲在重構代碼時保持這些動作更加容易。如果「外部應用程序」的作者將其代碼重構爲子包,重命名活動類等,則第二種方法將會中斷。基本上,活動名稱將成爲活動的公共API(如果您願意)記錄的額外)。這就是爲什麼你會看到Android SDK專門爲它自己記錄和支持的活動使用這種方法。

更快?

可能是第二個一個小小的速度增加,但我們會每startActivity()說話微秒,這是不值得擔心。

+0

感謝commons! – 2012-04-21 18:38:16

相關問題