getapplicationcontext - getpackagename android




從Activity上下文外調用startActivity() (14)

使用此代碼。 對我來說工作得很好; 從活動外分享某些東西

            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);

我在我的Android應用程序中實現了一個ListView 。 我使用ArrayAdapter類的自定義子類綁定到此ListView 。 在重寫的ArrayAdapter.getView(...)方法內,我分配了一個OnClickListener 。 在OnClickListeneronClick方法中,我想啟動一個新的活動。 我得到了一個例外:

Calling startActivity() from outside of an Activity  context requires the  
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

我怎樣才能得到ListView (當前Activity )正在工作的Context


再詳細闡述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"));


我也有同樣的問題。 檢查您已通過的所有上下文。 對於' 鏈接 ',它需要活動上下文而不是應用上下文

這是你應該檢查的地方:

1.)如果您使用了LayoutInflater,那麼請檢查您已傳遞的上下文。

2.)如果您正在使用任何適配器,請檢查您已通過的上下文。


我有同樣的問題。 問題與上下文有關。 如果你想打開任何鏈接(例如通過選擇器共享任何鏈接)傳遞活動上下文,而不是應用程序上下文。

如果您不在活動中,請不要忘記添加myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)


我用addFlags而不是“setFlags”解決了它

myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

根據它的addFlags

為意圖添加額外的標誌(或與現有的標誌值)。

編輯

請注意,如果您使用標誌來更改歷史堆棧,請參閱Alex Volovoy的答案 :

...避免設置標誌,因為它會干擾事件和歷史堆棧的正常流動。


  • 通過適配器中的構造函數緩存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);   

我希望這會起作用。





android-context