getapplicationcontext - getpackagename android
從Activity上下文外調用startActivity() (14)
我在我的Android應用程序中實現了一個ListView
。 我使用ArrayAdapter
類的自定義子類綁定到此ListView
。 在重寫的ArrayAdapter.getView(...)
方法內,我分配了一個OnClickListener
。 在OnClickListener
的onClick
方法中,我想啟動一個新的活動。 我得到了一個例外:
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
我怎樣才能得到ListView
(當前Activity
)正在工作的Context
?
使用此代碼。 對我來說工作得很好; 從活動外分享某些東西
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
// Append Text
String Text = "Your Text Here"
intent.putExtra(Intent.EXTRA_TEXT, Text);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent shareIntent = Intent.createChooser(intent,"Share . . . ");
shareIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
G.context.getApplicationContext().startActivity(shareIntent);
再詳細闡述Alex Volovoy的答案 -
如果你得到這個片段的問題,getActivity()可以正常工作來獲取上下文
在其他情況下:
如果你不想使用 -
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//not recommend
然後在你的OutsideClass中創建一個像這樣的函數 -
public void gettingContext(Context context){
real_context = context;//where real_context is a global variable of type Context
}
現在,在您的主要活動中,您在定義OutsideClass後立即創建新的OutsideClass以調用上述方法,並將活動的上下文作為參數。 同樣在你的主要活動中,
public void startNewActivity(final String activity_to_start) {
if(activity_to_start.equals("ACTIVITY_KEY"));
//ACTIVITY_KEY-is a custom key,just to
//differentiate different activities
Intent i = new Intent(MainActivity.this, ActivityToStartName.class);
activity_context.startActivity(i);
}//you can make a if-else ladder or use switch-case
現在回到你的OutsideClass,並開始新的活動做類似這樣的事情 -
@Override
public void onClick(View v) {
........
case R.id.any_button:
MainActivity mainAct = (MainActivity) real_context;
mainAct.startNewActivity("ACTIVITY_KEY");
break;
}
........
}
這樣你就可以開始從不同的OutsideClass調用不同的活動,而不會弄亂標誌。
注 - 盡量不要通過構造函數緩存片段對象(使用適配器,它很好)。片段應該有一個空構造函數,否則應用程序在某些情況下會崩潰。
記得打電話
OutsideClass.gettingContext(Context context);
在onResume()函數中也是如此。
在我看來,最好在Activity.class
的代碼中使用startActivity()
的方法。 如果你在Adapter
或其他類中使用它,會導致這種情況。
如果您在Cordova插件中調用共享意圖,設置標誌將無濟於事。 而是使用這個 -
cordova.getActivity().startActivity(Intent.createChooser(shareIntent, "title"));
對於任何人在Xamarin.Android(MonoDroid)上獲得這一點,即使在從活動調用StartActivity時 - 這實際上是Xamarin在新ART運行時的bug,請參閱https://bugzilla.xamarin.com/show_bug.cgi?id=17630
我也有同樣的問題。 檢查您已通過的所有上下文。 對於' 鏈接 ',它需要活動上下文而不是應用上下文 。
這是你應該檢查的地方:
1.)如果您使用了LayoutInflater,那麼請檢查您已傳遞的上下文。
2.)如果您正在使用任何適配器,請檢查您已通過的上下文。
我有同樣的問題。 問題與上下文有關。 如果你想打開任何鏈接(例如通過選擇器共享任何鏈接)傳遞活動上下文,而不是應用程序上下文。
如果您不在活動中,請不要忘記添加myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
。
或
- 通過適配器中的構造函數緩存Context對象,或
- 從你的角度來看它。
或者作為最後的手段,
- 將FLAG_ACTIVITY_NEW_TASK標誌添加到您的意圖中:
_
myIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
編輯 - 我會避免設置標誌,因為它會干擾正常的事件和歷史堆棧流。
當起始活動不知道他的活動是哪個時,就會出現這個錯誤。 所以你必須在startActivity()之前添加活動
你必須設置
activity.startActivity(yourIntent);
請參閱,如果您是使用某種方法在列表器中創建一個意圖
override onClick (View v).
然後通過這個視圖調用上下文:
v.getContext ()
甚至不需要SetFlags ...
面臨同樣的問題,然後執行
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
並解決了問題。
可能還有另一個與列表視圖適配器相關的原因。
你可以看到這個博客 ,描述得非常好。
Intent i= new Intent(context, NextActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
Intent viewIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(viewIntent);
我希望這會起作用。