android - प्रति आवेदन शुरू होने के बाद मैं कुछ कैसे निष्पादित कर सकता हूं?





android-3.0-honeycomb auto-update (9)


हां आप एंड्रॉइड की SharedPrefernce अवधारणा का उपयोग कर ऐसा कर सकते हैं। बस एक बुलियन ध्वज बनाएं और इसे SharePrefernce में सहेजें और अपने मूल्य को अपने क्रिएट () विधि में देखें।

मैं किसी एप्लिकेशन में एक अपडेट चेकर को कार्यान्वित करना चाहता हूं, और मुझे स्पष्ट रूप से केवल एप्लिकेशन को शुरू करने के बाद इसे दिखाने की आवश्यकता है। अगर मैं onStart() onCreate() या onStart() विधि में कॉल करता हूं, तो यह गतिविधि हर बार दिखाए जाने पर दिखाया जाएगा और यह एक व्यवहार्य समाधान नहीं है।

तो मेरा सवाल यह है: क्या कुछ ऐसा करने का कोई तरीका है, जैसे अद्यतनों की जांच करना, प्रति आवेदन शुरू होने / लॉन्च करने के बाद?

मुझे खेद है कि यह समझने में थोड़ा मुश्किल है, मुझे इस पर खुद को समझाने में कठिनाइयों का सामना करना पड़ रहा है।




 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  if (!prefs.getBoolean("onlyonce", false)) {
    // <---- run your one time code here


    // mark once runned.
    SharedPreferences.Editor editor = prefs.edit();
    editor.putBoolean("onlyonce", true);
    editor.commit();
  }
}



ऐसा लगता है कि आपको ऐसा कुछ करना पड़ सकता है

PackageInfo info = getPackageManager().getPackageInfo(PACKAGE_NAME, 0);

      int currentVersion = info.versionCode;
      this.versionName = info.versionName;
      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
      int lastVersion = prefs.getInt("version_code", 0);
      if (currentVersion > lastVersion) {
        prefs.edit().putInt("version_code", currentVersion).commit();
       //  do the activity that u would like to do once here.
   }

ऐप को अपग्रेड किया गया है या नहीं, यह जांचने के लिए आप इसे हर बार कर सकते हैं, इसलिए यह ऐप अपग्रेड के लिए केवल एक बार चलता है




मैंने इसे स्वयं करने का हल किया है, मैं एप्लिकेशन की निष्पादन में कई बार अपनी मुख्य गतिविधि को दोबारा खोलता हूं। जबकि कन्स्ट्रक्टर कुछ चीजों के लिए एक वैध दृष्टिकोण है, यह आपको अन्य चीजों के बीच टोस्ट लिखने के लिए वर्तमान अनुप्रयोग संदर्भ तक पहुंचने नहीं देता है

मेरा समाधान एक सरल 'फर्स्टरुन' बूलियन बनाने के लिए मेरी मुख्य गतिविधि की कक्षा में सच साबित करना था, वहां से अगर मैं कथन की सामग्री चलाता हूं तो इसे सत्य पर सेट करता हूं। उदाहरण:

public class MainActivity extends AppCompatActivity
{
     private static boolean firstRun = true;

     @Override
     protected void onCreate(Bundle savedInstanceState)
     {
         if(firstRun)
         {
              Toast.makeText(getApplicationContext(), "FIRST RUN", Toast.LENGTH_SHORT).show();
              //YOUR FIRST RUN CODE HERE
         }
         firstRun = false;

         super.onCreate(savedInstanceState);
         //THE REST OF YOUR CODE
}



मैं वही करता हूं जैसा कि दूसरे उत्तर में वर्णित है। मेरे पास पहली गतिविधि में एक वैश्विक चर है जो मैनिफेस्ट से रिलीज नंबर से मेल खाता है। मैं इसे प्रत्येक अपग्रेड के लिए बढ़ाता हूं और जब चेक उच्च संख्या देखता है, तो यह एक बार कोड निष्पादित करता है।

यदि सफल हो, तो यह साझा प्राथमिकताओं में नया नंबर लिखता है ताकि यह अगले अपग्रेड तक इसे फिर से न करे।

सुनिश्चित करें कि जब आप साझा वरीयताओं से संस्करण पुनर्प्राप्त करते हैं तो आप डिफ़ॉल्ट को -1 को असाइन करते हैं ताकि आप इसे चलाने के विरोध में कोड को चलाने के पक्ष में त्रुटि न करें और अपना ऐप सही तरीके से अपडेट न करें।




      try {

          boolean firstboot = getSharedPreferences("BOOT_PREF",MODE_PRIVATE)
    .getBoolean("firstboot", true);

                    if(firstboot){
                //place your code that will run single time                  
getSharedPreferences("BOOT_PREF",MODE_PRIVATE).edit().
    putBoolean("firstboot", false)
                        .commit();


                    }



इस के लिए साझा पेंशन का उपयोग करें-

  1. एक बार जब आपका ऐप सक्रिय हो जाता है तो आप अपनी लॉन्चर गतिविधि को दोबारा शुरू नहीं कर रहे हैं तो उस स्थिति में आप इसका इस्तेमाल करते हैं।

  2. यदि आप इसे ऐप में कार्यान्वित कर रहे हैं तो इसे स्पलैश स्क्रीन में उपयोग करें।

  3. यदि आप किसी स्प्लैश स्क्रीन का उपयोग नहीं कर रहे हैं तो आपको बिना किसी व्यू सेट के एक गतिविधि बनाने की आवश्यकता है और इसके ऑनक्रेट कॉल पर आप अपडेट शुरू कर सकते हैं और अपनी मुख्य गतिविधि शुरू कर सकते हैं।

आप इसके लिए काउंटर वैल्यू या बूलियन का उपयोग कर सकते हैं।

यहां साझा प्रेफरेंस दस्तावेज़ है:

http://developer.android.com/reference/android/content/SharedPreferences.html




साझा वरीयता दृष्टिकोण गन्दा है, और एप्लिकेशन क्लास की गतिविधि तक कोई पहुंच नहीं है।

एक और विकल्प जिसका मैंने उपयोग किया है, एक बनाए रखा खंड उदाहरण है, और उस उदाहरण के भीतर, बहुत अधिक सामान किया जा सकता है, खासकर यदि आपको मुख्य गतिविधि UI तक पहुंच की आवश्यकता है।

इस उदाहरण के लिए, मैंने बनाए रखा खंड के भीतर asynctask का उपयोग किया है। मेरे AsyncTask माता-पिता गतिविधि के लिए कॉलबैक है। यह प्रति आवेदन केवल एक बार चलाने की गारंटी है क्योंकि टुकड़ा कभी नष्ट नहीं होता है-उसी गतिविधि को नष्ट होने पर पुनर्निर्मित किया जाता है। यह एक बनाए रखा टुकड़ा है।

public class StartupTaskFragment extends Fragment {

public interface Callbacks {
    void onPreExecute();
    void onProgressUpdate(int percent);
    void onCancelled();
    void onPostExecute();
}

public static final String TAG = "startup_task_fragment";
private Callbacks mCallbacks;
private StartupTask mTask;

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mCallbacks = (Callbacks) activity;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setRetainInstance(true); // this keeps fragment in memory even if parent activity is destroyed

    mTask = new StartupTask();
    mTask.execute();
}

@Override
public void onDetach() {
    super.onDetach();
    mCallbacks = null;
}

private class StartupTask extends AsyncTask<Void, Integer, Void> {

    @Override
    protected void onPreExecute() {
        if (mCallbacks != null) {
            mCallbacks.onPreExecute();
        }
    }

    @Override
    protected Void doInBackground(Void... ignore) {

        // do stuff here

        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... percent) {
        if (mCallbacks != null) {
            mCallbacks.onProgressUpdate(percent[0]);
        }
    }

    @Override
    protected void onCancelled() {
        if (mCallbacks != null) {
            mCallbacks.onCancelled();
        }
    }

    @Override
    protected void onPostExecute(Void ignore) {
        if (mCallbacks != null) {
            mCallbacks.onPostExecute();
        }
    }
}
}

फिर, मुख्य (या अभिभावक) गतिविधि में जहां आप इस स्टार्टअप कार्य खंड को एक बार चलाने के लिए चाहते हैं।

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    FragmentManager fm = getFragmentManager();
    StartupTaskFragment st = (StartupTaskFragment) fm.findFragmentByTag(StartupTaskFragment.TAG);

    if(st == null) {
        fm.beginTransaction().add(mStartupTaskFragment = new StartupTaskFragment(), StartupTaskFragment.TAG).commit();
    }

    ...
}

बनाए रखा टुकड़ा के लिए विचार यहां से आए: http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html । मैंने बस कॉन्फ़िगरेशन परिवर्तनों से अलग अपने अन्य उपयोगों को समझ लिया।




यदि आप उपयोगकर्ता को सभी ब्राउज़र सूची के साथ एक संवाद दिखाना चाहते हैं, तो वह पसंदीदा चुन सकते हैं, यहां नमूना कोड है:

private static final String HTTPS = "https://";
private static final String HTTP = "http://";

public static void openBrowser(final Context context, String url) {

     if (!url.startsWith(HTTP) && !url.startsWith(HTTPS)) {
            url = HTTP + url;
     }

     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
     context.startActivity(Intent.createChooser(intent, "Choose browser"));// Choose browser is arbitrary :)

}




android android-3.0-honeycomb auto-update