2017-11-17 22 views
8

Xamarin में नई अप्रचलित चेतावनी। फोरम 2.5 ने वास्तव में मुझे परेशान किया। निर्भरता सेवाओं में मुझे किस संदर्भ का उपयोग करना चाहिए, उदाहरण के लिए, GetSystemService() को कॉल करने के लिए?Xamarin.Forms: Forms.Context अप्रचलित

क्या मुझे एक स्थिर क्षेत्र में स्टोर करना चाहिए, गतिविधि के संदर्भ में xamarin रूपों को प्रारंभ किया गया था?

क्या मुझे एंड्रॉइड एप्लिकेशन क्लास को ओवरराइड करना चाहिए और इसके संदर्भ का उपयोग करना चाहिए?

क्या मुझे गतिविधि पर GetSystemService को कॉल करना चाहिए और उसे कहीं सेव करना चाहिए?

उत्तर

13

मैं कई 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

+0

धन्यवाद। यह – loowool

+0

काम करता है यह कस्टमTabsActivityManager (Android.App.Aplication.Context गतिविधि के रूप में) के साथ काम नहीं कर रहा है। कोई विकल्प? – Shubhan

+0

@ शुभन क्या आप सिर्फ माता-पिता की गतिविधि में नहीं जा सकते? –