यहां सभी कॉलबैक विधियों के लिए एक वैकल्पिक समाधान है, जो सभी गतिविधि चक्र के साथ एक ही अपरिभाषित ईवेंट ऑर्डर व्यवहार के अधीन हो सकते हैं। जब तक आप प्रत्येक कॉल के लिए सभी एंड्रॉइड कोड का निरीक्षण नहीं करेंगे, तब तक आप मूल ट्रिगर को निर्धारित करने के लिए उपयोग करते हैं और जो कार्यान्वयन को नियंत्रित करते हैं और उम्मीद करते हैं कि भविष्य में कोड आधार नहीं बदला जाता है, क्या कोई वास्तव में बता सकता है कि कॉलबैक के बीच ईवेंट ऑर्डर और गतिविधि जीवन चक्र घटनाओं की गारंटी दी जा सकती है।
अभी विकास के उद्देश्यों के लिए आदेश के इन इंटरैक्शन को अनिर्धारित व्यवहार के रूप में संदर्भित किया जा सकता है।
तो इस अपरिभाषित व्यवहार को हमेशा सही तरीके से संभालना होगा, जैसे ऑर्डर परिभाषित व्यवहार सुनिश्चित करने के द्वारा यह पहली जगह में कभी भी समस्या नहीं होगी।
उदाहरण के लिए मेरा सोनी एक्सपीरिया, नींद पर, ऐप को नष्ट करके, और फिर इसे पुनरारंभ करके इसे रोकता है और इसे रोकता है, इसे मानता है या नहीं।
मेजबान पर्यावरण उपकरणों के लिए विशेष परीक्षण निर्माण के रूप में Google को उनके एसडीके में कितना ईवेंट ऑर्डरिंग व्यवहार परीक्षण प्रदान करता है, मुझे नहीं पता, लेकिन उन्हें निश्चित रूप से यह सुनिश्चित करने के लिए प्रयास करने की आवश्यकता है कि ईवेंट ऑर्डर के व्यवहार सभी बंद हो जाएं बल्कि इस मामले पर सख्त।
https://code.google.com/p/android/issues/detail?id=214171&sort=-opened&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened
आयात android.util.Log; आयात android.util.SparseArray;
/** * 2016/06/24 को वॉलीवर द्वारा बनाया गया। * * एंड्रॉइड होस्ट वातावरण, ऑनक्रेट, ऑनस्टार्ट, ऑनस्यूम, ऑन पॉज़, ऑनस्टॉप, ऑनस्टरी, * के लिए एक गतिविधि लाइफ साइकिल को निर्देशित करता है * जहां हमें अन्य अनुप्रयोगों के उपयोग के लिए स्मृति और हैंडल जारी करने की आवश्यकता होती है। * फिर से शुरू होने पर हमें इन वस्तुओं को अन्य वस्तुओं के साथ पुनर्निर्मित करने और सक्रिय करने की आवश्यकता होती है। * आम तौर पर ये अन्य ऑब्जेक्ट्स मेजबान वातावरण से कॉलबैक विधियां प्रदान करते हैं जो * ऑनक्रेटेड और ऑनड्रॉयय प्रदान करते हैं, जिसमें हम केवल ऑनक्रेटेड से इस ऑब्जेक्ट से जुड़ सकते हैं और * डायस्टोरी पर बाध्य कर सकते हैं। * इस प्रकार के कॉल बैक विधियों, चलाने के लिए शेड्यूल टाइम हमारे होस्ट वातावरण * द्वारा नियंत्रक है और उनकी गतिविधि की लाइफ साइकिल के निष्पादन के व्यवहार/आदेश की गारंटी नहीं है और इन कॉल बैक विधियों * लगातार बना हुआ है। * विकास के उद्देश्य के लिए निष्पादन के अंतःक्रियाओं और आदेश को तकनीकी रूप से अपरिभाषित * कहा जा सकता है क्योंकि यह होस्ट कार्यान्वयन कार्यान्वयनकर्ता, सैमसंग, सोनी, एचटीसी पर निर्भर करता है। * * निम्नलिखित डेवलपर दस्तावेज़ देखें: https://developer.android.com/reference/android/app/Activity.html * उद्धरण: * यदि कोई गतिविधि किसी अन्य गतिविधि द्वारा पूरी तरह से अस्पष्ट है, तो यह बंद हो जाती है। यह अभी भी सभी राज्य * और सदस्य की जानकारी को बरकरार रखता है, हालांकि, यह अब उपयोगकर्ता के लिए दृश्यमान नहीं है, इसलिए इसकी विंडो * छिपी हुई है और जब स्मृति की आवश्यकता होती है तो इसे अक्सर सिस्टम द्वारा मारा जाएगा। * EndQuato: * * यदि गतिविधि छिपी नहीं है, तो किसी भी कॉलबैक को मेजबान * सिस्टम द्वारा कॉल करने की अपेक्षा की जाती है, जिसे ऑनक्रेट और ऑनडिस्टरी विधियों इंटरफ़ेस SurfaceView कॉलबैक नहीं कहा जाएगा। * इसका मतलब है कि आपको उस ऑब्जेक्ट को रोकना होगा जो सतह 0V* पर रोकथाम में अवरुद्ध हो गया है और ऑब्जेक्ट को कभी भी पुनर्विचार नहीं करेगा क्योंकि ऑनक्रेट कॉलबैक कभी नहीं कहा जाएगा। * */
public abstract class WaitAllActiveExecuter<Size>
{
private SparseArray<Boolean> mReferancesState = null;
// Use a dictionary and not just a counter, as hosted code
// environment implementer may make a mistake and then may double executes things.
private int mAllActiveCount = 0;
private String mContextStr;
public WaitAllActiveExecuter(String contextStr, int... identifiers)
{
mReferancesState = new SparseArray<Boolean>(identifiers.length);
mContextStr = contextStr;
for (int i = 0; i < identifiers.length; i++)
mReferancesState.put(identifiers[i], false);
}
public void ActiveState(int identifier)
{
Boolean state = mReferancesState.get(identifier);
if (state == null)
{
// Typically panic here referance was not registered here.
throw new IllegalStateException(mContextStr + "ActiveState: Identifier not found '" + identifier + "'");
}
else if(state == false){
mReferancesState.put(identifier, true);
mAllActiveCount++;
if (mAllActiveCount == mReferancesState.size())
RunActive();
}
else
{
Log.e(mContextStr, "ActivateState: called to many times for identifier '" + identifier + "'");
// Typically panic here and output a log message.
}
}
public void DeactiveState(int identifier)
{
Boolean state = mReferancesState.get(identifier);
if (state == null)
{
// Typically panic here referance was not registered here.
throw new IllegalStateException(mContextStr + "DeActiveState: Identifier not found '" + identifier + "'");
}
else if(state == true){
if (mAllActiveCount == mReferancesState.size())
RunDeActive();
mReferancesState.put(identifier, false);
mAllActiveCount--;
}
else
{
Log.e(mContextStr,"DeActiveState: State called to many times for identifier'" + identifier + "'");
// Typically panic here and output a log message.
}
}
private void RunActive()
{
Log.v(mContextStr, "Executing Activate");
ExecuterActive();
}
private void RunDeActive()
{
Log.v(mContextStr, "Executing DeActivate");
ExecuterDeActive();
}
abstract public void ExecuterActive();
abstract public void ExecuterDeActive();
}
कार्यान्वयन और वर्ग का उपयोग, जो या एंड्रॉयड मेजबान वातावरण इसको लागू करने की अपरिभाषित व्यवहार के साथ सौदों का उदाहरण।
private final int mBCTSV_SurfaceViewIdentifier = 1;
private final int mBCTSV_CameraIdentifier = 2;
private WaitAllActiveExecuter mBindCameraToSurfaceView =
new WaitAllActiveExecuter("BindCameraToSurfaceViewe", new int[]{mBCTSV_SurfaceViewIdentifier, mBCTSV_CameraIdentifier})
{
@Override
public void ExecuterActive() {
// Open a handle to the camera, if not open yet and the SurfaceView is already intialized.
if (mCamera == null)
{
mCamera = Camera.open(mCameraIDUsed);
if (mCamera == null)
throw new RuntimeException("Camera could not open");
// Look at reducing the calls in the following two methods, some this is unessary.
setDefaultCameraParameters(mCamera);
setPreviewSizesForCameraFromSurfaceHolder(getSurfaceHolderForCameraPreview());
}
// Bind the Camera to the SurfaceView.
try {
mCamera.startPreview();
mCamera.setPreviewDisplay(getSurfaceHolderForCameraPreview());
} catch (IOException e) {
e.printStackTrace();
ExecuterDeActive();
throw new RuntimeException("Camera preview could not be set");
}
}
@Override
public void ExecuterDeActive() {
if (mCamera != null)
{
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}
};
@Override
protected void onPause() {
mBindCameraToSurfaceView.DeactiveState(mBCTSV_CameraIdentifier);
Log.v(LOG_TAG, "Activity Paused - After Super");
}
@Override
public void onResume() {
mBindCameraToSurfaceView.ActiveState(mBCTSV_CameraIdentifier);
}
private class SurfaceHolderCallback implements SurfaceHolder.Callback
{
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Log.v(LOG_TAG, "Surface Changed");
}
public void surfaceCreated(SurfaceHolder surfaceHolder) {
Log.v(LOG_TAG, "Surface Created");
mBindCameraToSurfaceView.ActiveState(mBCTSV_SurfaceViewIdentifier);
}
public void surfaceDestroyed(SurfaceHolder arg0) {
Log.v(LOG_TAG, "Surface Destoryed");
mBindCameraToSurfaceView.DeactiveState(mBCTSV_SurfaceViewIdentifier);
}
}
किस एंड्रॉइड प्लाफॉर्म/एपीआई स्तर में आप विकास कर रहे हैं? – FerranB