यह तब हो सकता की वजह से कई कारणों से है, लेकिन उम्मीद है कि यह एक दुर्लभ घटना है: एक बंडल onCreate में वापस आ गया है, जिसमें सब कुछ शामिल करना चाहिए आप को बचाया मिलता है। ओएस संसाधनों को पुनः प्राप्त करने की आवश्यकता होने पर पृष्ठभूमि को नष्ट कर देगा, जो कम स्मृति और प्रसंस्करण शक्ति वाले उपकरणों पर होने की अधिक संभावना है।
Do not keep Activities
सेटिंग का उपयोग इस परिदृश्य का परीक्षण करने का एक अच्छा तरीका है, और इस मामले में अन्य समस्याएं हैं भले ही गतिविधि/टुकड़ा फिर से बनाया जाए। इस सेटिंग को सक्षम करने के साथ, प्लेसपिकर दिखाए जाने पर गतिविधि और टुकड़ा नष्ट हो जाता है, और फिर जब onActivityResult()
आता है, तो कोई वैध संदर्भ नहीं है क्योंकि गतिविधि और टुकड़ा अभी भी पुन: निर्मित होने की प्रक्रिया में हैं।
मैं इस विकलांग स्थापित करने के साथ एक नियंत्रित परीक्षण प्रदर्शन से पता चला है, और फिर सेटिंग सक्षम के साथ, और फिर परिणाम
मैं गतिविधि के लिए प्रत्येक जीवन चक्र कॉलबैक और क्रम में टुकड़ा में प्रवेश करने के रख को देखकर इन कॉलों के दौरान क्या हो रहा है इसका एक अनुमान प्राप्त करने के लिए।
यहाँ पूर्ण वर्ग मैं प्रयोग किया जाता है कि दोनों गतिविधि और टुकड़ा भी शामिल है:
public class MainActivity extends AppCompatActivity {
MyFragment myFrag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("PlacePickerTest", "Activity onCreate");
myFrag = new MyFragment();
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, myFrag)
.commit();
}
}
@Override
protected void onResume() {
super.onResume();
Log.d("PlacePickerTest", "Activity onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d("PlacePickerTest", "Activity onPause");
}
@Override
protected void onDestroy() {
Log.d("PlacePickerTest", "Activity onDestroy");
super.onDestroy();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public void onActivityResult (int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d("PlacePickerTest", "Activity onActivityResult requestCode:" + requestCode);
if (requestCode == 199){
//process result of PlacePicker in the Fragment
myFrag.processActivityResult(data);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
//open PlacePicker from menu item
myFrag.startPlacePicker();
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Fragment containing a map and PlacePicker functionality
*/
public static class MyFragment extends Fragment {
private GoogleMap mMap;
Marker marker;
public MyFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
Log.d("PlacePickerTest", "Fragment onCreateView");
return rootView;
}
@Override
public void onResume() {
super.onResume();
Log.d("PlacePickerTest", "Fragment onResume");
setUpMapIfNeeded();
}
@Override
public void onPause() {
super.onPause();
Log.d("PlacePickerTest", "Fragment onPause");
}
@Override
public void onDestroy() {
Log.d("PlacePickerTest", "Fragment onDestroy");
super.onDestroy();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap();
}
}
}
private void setUpMap() {
// Enable MyLocation Layer of Google Map
mMap.setMyLocationEnabled(true);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
mMap.getUiSettings().setCompassEnabled(true);
mMap.getUiSettings().setRotateGesturesEnabled(true);
mMap.getUiSettings().setZoomGesturesEnabled(true);
}
public void startPlacePicker(){
int PLACE_PICKER_REQUEST = 199;
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
//Context context = getActivity();
try {
Log.d("PlacePickerTest", "Fragment startActivityForResult");
getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
} catch (GooglePlayServicesRepairableException e) {
e.printStackTrace();
} catch (GooglePlayServicesNotAvailableException e) {
e.printStackTrace();
}
}
public void processActivityResult (Intent data) {
if (getActivity() == null) return;
Log.d("PlacePickerTest", "Fragment processActivityResult");
//process Intent......
Place place = PlacePicker.getPlace(data, getActivity());
String placeName = String.format("Place: %s", place.getName());
String placeAddress = String.format("Address: %s", place.getAddress());
LatLng toLatLng = place.getLatLng();
// Show the place location in Google Map
mMap.moveCamera(CameraUpdateFactory.newLatLng(toLatLng));
mMap.animateCamera(CameraUpdateFactory.zoomTo(15));
if (marker != null) {
marker.remove();
}
marker = mMap.addMarker(new MarkerOptions().position(toLatLng)
.title(placeName).snippet(placeAddress)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
}
}
}
यहाँ जिसके परिणामस्वरूप लॉग कि क्या जीवन चक्र कॉलबैक सामान्य परिस्थितियों में इस प्रक्रिया के दौरान कहा जाता है में जानकारी दे रहे हैं:
D/PlacePickerTest﹕ Activity onCreate
D/PlacePickerTest﹕ Fragment onCreateView
D/PlacePickerTest﹕ Activity onResume
D/PlacePickerTest﹕ Fragment onResume
D/PlacePickerTest﹕ Fragment startActivityForResult
D/PlacePickerTest﹕ Fragment onPause
D/PlacePickerTest﹕ Activity onPause
D/PlacePickerTest﹕ Activity onActivityResult requestCode:199
D/PlacePickerTest﹕ Fragment processActivityResult
D/PlacePickerTest﹕ Activity onResume
D/PlacePickerTest﹕ Fragment onResume
तो, जैसा कि आप देख सकते हैं onDestroy()
कभी नहीं कहा जाता है, और onPause()
और onResume()
दोनों गतिविधि और टुकड़ा पर कहा जाता है।
फिर एक जगह चुनने के बाद:: फिर
, मैं Do not keep Activities
सेटिंग में डेवलपर विकल्प के तहत सक्षम है, और एक ही परीक्षण भाग गया
यहाँ नेत्रहीन परिणाम है ।
इन जिसके परिणामस्वरूप लॉग हैं:
D/PlacePickerTest﹕ Activity onCreate
D/PlacePickerTest﹕ Fragment onCreateView
D/PlacePickerTest﹕ Activity onResume
D/PlacePickerTest﹕ Fragment onResume
D/PlacePickerTest﹕ Fragment startActivityForResult
D/PlacePickerTest﹕ Fragment onPause
D/PlacePickerTest﹕ Activity onPause
D/PlacePickerTest﹕ Activity onDestroy
D/PlacePickerTest﹕ Fragment onDestroy
D/PlacePickerTest﹕ Activity onCreate
D/PlacePickerTest﹕ Fragment onCreateView
D/PlacePickerTest﹕ Activity onActivityResult requestCode:199
D/PlacePickerTest﹕ Activity onResume
D/PlacePickerTest﹕ Fragment onResume
तो, आप देख सकते हैं दोनों गतिविधि और टुकड़ा नष्ट कर रहे हैं जब PlacePicker दिखाया गया है, और बाद जगह PlacePicker में उठाया जाता है, कोड निष्पादन नहीं मिला Fragment processActivityResult
लॉग प्रविष्टि के लिए, और ऐप ने मानचित्र पर चुनी गई जगह कभी नहीं दिखायी।
अशक्त संदर्भ की जांच करने की वजह से है कि:
if (getActivity() == null) return;
Log.d("PlacePickerTest", "Fragment processActivityResult");
//process Intent......
Place place = PlacePicker.getPlace(data, getActivity());
तो, onActivityResult()
करने के लिए कॉल में आता है, लेकिन यह एक ही समय है कि गतिविधि और टुकड़ा हो रही फिर से बनाई गई हैं पर ऐसा नहीं करता है, और PlacePicker.getPlace(data, getActivity());
पर कॉल करने के लिए आपको एक वैध संदर्भ की आवश्यकता है।
अच्छी खबर यह है सबसे अंत उपयोगकर्ताओं Do not keep Activities
सेटिंग सक्षम नहीं होगा कि है, और ज्यादातर समय अपनी गतिविधि ओएस द्वारा नष्ट नहीं किया जाएगा।
* "मेरा आवेदन प्रारंभ करने के बाद नष्ट हो रहा है सक्रियताफॉर रिसेट कॉल।" * क्या आपका मतलब यह क्रैश हो रहा है? – codeMagic
क्या आपने अपनी मेनिफेस्ट फ़ाइल में एक इरादा फ़िल्टर प्रदान किया है? यह इसलिए आवश्यक है कि अपनी गतिविधि निर्मित किया जा सकता है – Mann
@codeMagic यह startActivityForResult बुला crashing.After नहीं कर रहा है, मैं MainActivity में onDestory विधि देख सकते हैं .और कहा जाता हो रही है जब मैं शुरू की गतिविधि से एक जगह का चयन करें, यह returns.But अपने आवेदन पुनः नहीं है । अगर मैं जगह को जल्दी से चुनता हूं (मेरी मुख्य क्रिया से पहले) नष्ट हो रहा है), एक्टिविटी रिसेट को सही तरीके से बुलाया जा रहा है। – Renjith