मैं कई Dependency Services
साथ एकल गतिविधि आवेदन
Android.App.Application.Context
के लिए सरल समाधान
मामलों का एक बहुत में एक ही मुद्दा हो रही थी
Xamarin.Forms.Forms.Context
के साथ प्रतिस्थापित किया जा सकता है
और अधिक विस्तार में पृष्ठभूमि
Android.App.Application.Context
रिटर्न वर्तमान प्रक्रिया के रूप में एक गतिविधि संदर्भ के लिए apposed, आवेदन के जीवन चक्र से बंधा के वैश्विक आवेदन प्रसंग।
एप्लिकेशन संदर्भ का उपयोग करने का एक सामान्य उदाहरण गतिविधि शुरू करने के लिए है।
Android.App.Application.Context.StartActivity(myIntent);
अंगूठे का सामान्य नियम वर्तमान गतिविधि संदर्भ का उपयोग करने के, जब तक आप जरूरत है एक वस्तु है कि आपके गतिविधि बाद भी बरकरार रहता से एक संदर्भ के लिए एक संदर्भ को बचाने के लिए है। इस मामले में आवेदन संदर्भ
फॉर्म.कॉन्टेक्स्ट अप्रचलित क्यों हुआ?
Xmarin.Forms 2.5 ने एक नया "फॉर्म एम्बेडिंग" सुविधा पेश की, जो Xamarin.iOS/Xamarin.Android ऐप्स में फॉर्म पेज एम्बेड कर सकता है। हालांकि, Xamarin.Android ऐप्स कई क्रियाकलापों का उपयोग कर सकते हैं, प्रतीत होता है कि Xamarin.Android
उपयोगकर्ताओं को Forms.Context
पर कॉल करने वाले उपयोगकर्ताओं का खतरा था और बदले में MainActivity
का संदर्भ प्राप्त हो रहा था, जिसमें संभावित कारण समस्याएं हैं।
आसपास काम एक प्रतिपादक के अंदर आप अब जो निर्माता में पारित हो जाता दृश्य के संदर्भ के लिए एक संदर्भ मिलता है।
किसी भी अन्य वर्ग के साथ आप गतिविधि संदर्भ कैसे प्राप्त करें इस मुद्दे के साथ सामना कर रहे हैं। एकल गतिविधि अनुप्रयोग (ज्यादातर मामलों में) Application.Context
ठीक काम करेगा।
हालांकि में वर्तमान गतिविधि संदर्भ प्राप्त करने के लिए एकाधिक गतिविधि अनुप्रयोग आपको इसका संदर्भ रखना होगा।ऐसा करने का सबसे आसान और सबसे विश्वसनीय तरीका class
के माध्यम से है जो Application.IActivityLifecycleCallbacks
इंटरफ़ेस लागू करता है।
मुख्य विचार कॉन्टेक्स्ट का संदर्भ रखना है जब एक गतिविधि बनाई जाती है, शुरू होती है, या फिर से शुरू होती है।
[Application]
public partial class MainApplication : Application, Application.IActivityLifecycleCallbacks
{
internal static Context ActivityContext { get; private set; }
public MainApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { }
public override void OnCreate()
{
base.OnCreate();
RegisterActivityLifecycleCallbacks(this);
}
public override void OnTerminate()
{
base.OnTerminate();
UnregisterActivityLifecycleCallbacks(this);
}
public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
{
ActivityContext = activity;
}
public void OnActivityResumed(Activity activity)
{
ActivityContext = activity;
}
public void OnActivityStarted(Activity activity)
{
ActivityContext = activity;
}
public void OnActivityDestroyed(Activity activity) { }
public void OnActivityPaused(Activity activity) { }
public void OnActivitySaveInstanceState(Activity activity, Bundle outState) { }
public void OnActivityStopped(Activity activity) { }
}
ऊपर दृष्टिकोण के साथ
, एकल गतिविधि आवेदन और कई गतिविधि आवेदन अब हमेशा वर्तमान/स्थानीय गतिविधि संदर्भ के लिए उपयोग किया जा सकता है। उदाहरण के बजाय वैश्विक संदर्भ पर निर्भर की
Android.App.Application.Context
// or previously
Xamarin.Forms.Forms.Context
अब एक निर्भरता सेवा
if (MainApplication.ActivityContext!= null)
{
versionNumber = MainApplication.ActivityContext
.PackageManager
.GetPackageInfo(MainApplication.ActivityContext.PackageName, 0)
.VersionName;
}
अतिरिक्त संसाधन में
MainApplication.ActivityContext
उदाहरण कॉल के साथ प्रतिस्थापित किया जा सकता है
0,123,
Android.App.Application.IActivityLifecycleCallbacks
registerActivityLifecycleCallbacks
धन्यवाद। यह – loowool
काम करता है यह कस्टमTabsActivityManager (Android.App.Aplication.Context गतिविधि के रूप में) के साथ काम नहीं कर रहा है। कोई विकल्प? – Shubhan
@ शुभन क्या आप सिर्फ माता-पिता की गतिविधि में नहीं जा सकते? –