ตรวจสอบว่ามีการใช้แอป Android เป็นครั้งแรกหรือไม่


112

ฉันกำลังพัฒนาแอพ Android ฉันต้องทำอะไรบางอย่างเมื่อเปิดตัวแอปเป็นครั้งแรกนั่นคือโค้ดจะทำงานในครั้งแรกที่เปิดตัวโปรแกรมเท่านั้น


1
เมื่อฉันเริ่มสร้างแอพครั้งแรกฉันคิดถึงการรันครั้งแรกหลังจากติดตั้งแอพเท่านั้น หลังจากนั้นฉันก็รู้ว่าฉันจำเป็นต้องจัดการและแยกความแตกต่างของการวิ่งครั้งแรกหลังจากอัปเกรด คำตอบของ @ schnatterer ด้านล่างและคำตอบของฉันที่นี่แสดงวิธีการทำเช่นนี้ ระมัดระวังคำตอบที่ไม่คำนึงถึงการอัพเกรด
Suragch

@Suragch คุณกำลังทำเหมือนเป็นการปฏิบัติที่ไม่ดีที่จะไม่คำนึงถึงการอัปเกรด แต่ในบางกรณีเช่นมีการแนะนำแอปที่คุณไม่ต้องการทำ :)
creativecreatorormaybenot

@creativecreatorormaybenot นั่นคือเรื่องจริง มีหลายครั้งที่คุณสนใจเฉพาะการติดตั้งครั้งแรกไม่ใช่การอัพเกรดในภายหลัง บูลีนธรรมดาก็เพียงพอแล้วสำหรับสถานการณ์เหล่านั้น อย่างไรก็ตามหากในอนาคตคุณต้องการเพิ่มการแนะนำอื่นสำหรับผู้ใช้ปัจจุบันเกี่ยวกับคุณสมบัติใหม่ทั้งหมดที่คุณเพิ่งเพิ่มในการอัปเดตครั้งล่าสุด ในความคิดของฉันการตรวจสอบหมายเลขเวอร์ชันมากกว่าบูลีนเป็นการมองการณ์ไกล อย่างน้อยสิ่งนี้จะช่วยให้คุณมีตัวเลือกในอนาคตในการตอบสนองวิธีหนึ่งสำหรับการติดตั้งใหม่และอีกวิธีหนึ่งสำหรับการอัปเกรด
Suragch

1
จากนั้นคุณเพิ่งเพิ่มสำหรับเวอร์ชันนี้ แต่ฉันได้รับ yoz
creativecreatorormaybenot

คุณสามารถตรวจสอบstackoverflow.com/a/7217834/2689076
Vaibhav

คำตอบ:


56

อีกแนวคิดหนึ่งคือการใช้การตั้งค่าใน Shared Preferences แนวคิดทั่วไปเหมือนกับการตรวจสอบไฟล์ว่าง แต่คุณไม่มีไฟล์ว่างลอยอยู่รอบ ๆ ไม่ได้ใช้เพื่อจัดเก็บอะไรเลย


3
ระวังว่าวิธีการแบบนี้ไม่สามารถใช้ได้กับ Samsung Galaxy S ที่ใช้ Android Froyo นั่นเป็นเพราะจุดบกพร่องในการบันทึก SharedPreferences นี่คือลิงค์ไปยังคำถาม SO ในเรื่องนี้: stackoverflow.com/questions/7296163/…และนี่คือตั๋วในรหัส google: code.google.com/p/android/issues/detail?id=14359
Francesco Rigoni

4
ระวังสำหรับ Android 6.0 (API 23 - Marshmallow) หรือสูงกว่าการสำรองข้อมูลอัตโนมัติ ( developer.android.com/guide/topics/data/autobackup.html) จะเปิดใช้งานโดยค่าเริ่มต้น หากผู้ใช้ถอนการติดตั้งแล้วติดตั้งแอปใหม่การตั้งค่าที่ใช้ร่วมกันจะถูกกู้คืน ดังนั้นในการติดตั้งใหม่คุณไม่สามารถตรวจสอบได้ว่ากำลังทำงานเป็นครั้งแรกหรือไม่หลังจากการติดตั้งใหม่หากเป็นปัญหาใด ๆ
Alan

1
@Alan คุณพูดถูกคำตอบนี้ใช้ไม่ได้จาก Android Marshmallow อีกต่อไป
Ioane Sharvadze

1
@ ลันคุณนึกไม่ออกว่าฉันหาคำตอบแบบคุณมานานแค่ไหน คุณทำให้วันของฉัน ขอบคุณ!
Antonio

@Alan แต่การสำรองข้อมูลอัตโนมัติยังบันทึกข้อมูลอื่น ๆ ส่วนใหญ่ ดังนั้นแอปที่ติดตั้งใหม่จึงคาดว่าจะอยู่ในสถานะไม่ได้เปิดใช้งานครั้งแรก และผู้ใช้เคยใช้แอปมาก่อนแล้วจึงไม่จำเป็นต้องมีคำแนะนำ ดังนั้นฉันจะเถียงสำหรับกรณีส่วนใหญ่มันเป็นสิ่งที่ดีที่เกิดขึ้น
smdufb

112

คุณสามารถใช้SharedPreferencesเพื่อระบุว่าเป็น "ครั้งแรก" ที่เปิดตัวแอปหรือไม่ เพียงใช้ตัวแปรบูลีน ("my_first_time") และเปลี่ยนค่าเป็นเท็จเมื่องาน "ครั้งแรก" ของคุณสิ้นสุดลง

นี่คือรหัสของฉันที่ใช้จับในครั้งแรกที่คุณเปิดแอป:

final String PREFS_NAME = "MyPrefsFile";

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);

if (settings.getBoolean("my_first_time", true)) {
    //the app is being launched for first time, do something        
    Log.d("Comments", "First time");

             // first time task

    // record the fact that the app has been started at least once
    settings.edit().putBoolean("my_first_time", false).commit(); 
}

17
จะรับมือได้หรือไม่เมื่อแอปจะได้รับการอัปเดตเป็นเวอร์ชันถัดไปบน Google Play Store
Shajeel Afzal

4
SharedPreferences จะคงอยู่ในระหว่างการอัพเกรด ดังนั้นฉันคิดว่าเมื่ออัปเกรดจาก PlayStore แล้วค่าเก่าจะพร้อมใช้งาน ในความเป็นจริงมันสามารถใช้ได้กับวิธีการอื่นเช่นการตรวจสอบการมีอยู่ของไฟล์ด้วย ดังนั้นวิธีทางลัดในกรณีนั้นคือการใช้การตั้งค่า / ชื่อไฟล์หรือค่าที่แตกต่างกัน
Tejasvi Hegde

@ShajeelAfzal สิ่งนี้อาจช่วยให้คุณเป็นโมฆะสาธารณะ CheckAndInitAppFirstTime () {สตริงสุดท้าย PREFS_NAME = "TheAppVer"; สตริงสุดท้าย CHECK_VERSION = "1"; // ver ... สตริงสุดท้าย KEY_NAME = "CheckVersion"; การตั้งค่า SharedPreferences = getSharedPreferences (PREFS_NAME, 0); ถ้า (! settings.getString (KEY_NAME, "0"). เท่ากับ (CHECK_VERSION)) {// กำลังเปิดแอปเป็นครั้งแรกให้ทำบางอย่างหรือ CHECK_VERSION แตกต่างออกไป // ... settings.edit (). putString ( KEY_NAME, CHECK_VERSION) .commit (); }}
Tejasvi Hegde

@aman verma: ตามคำอธิบาย getBoolean ที่developer.android.com/reference/android/content/…พารามิเตอร์ที่ 2 ของ getBoolean เป็นค่าเริ่มต้นหากพารามิเตอร์แรกไม่ออกดังนั้นหากยังไม่ได้ตั้งค่า "my_first_time" นิพจน์มีค่าเริ่มต้นเป็นจริง
user2798692

63

ฉันขอแนะนำให้ไม่เพียงเก็บแฟล็กบูลีนเท่านั้น แต่ยังต้องระบุโค้ดเวอร์ชันที่สมบูรณ์ด้วย ด้วยวิธีนี้คุณสามารถสอบถามได้ในตอนต้นหากเป็นการเริ่มต้นครั้งแรกในเวอร์ชันใหม่ คุณสามารถใช้ข้อมูลนี้เพื่อแสดงกล่องโต้ตอบ "มีอะไรใหม่" ได้เช่น

โค้ดต่อไปนี้ควรใช้งานได้จากคลาส Android ที่ "เป็นบริบท" (กิจกรรมบริการ ... ) หากคุณต้องการที่จะมีมันในการแยก (POJO) ระดับคุณสามารถพิจารณาใช้ "บริบทคงที่" ตามที่อธิบายไว้ที่นี่เช่น

/**
 * Distinguishes different kinds of app starts: <li>
 * <ul>
 * First start ever ({@link #FIRST_TIME})
 * </ul>
 * <ul>
 * First start in this version ({@link #FIRST_TIME_VERSION})
 * </ul>
 * <ul>
 * Normal app start ({@link #NORMAL})
 * </ul>
 * 
 * @author schnatterer
 * 
 */
public enum AppStart {
    FIRST_TIME, FIRST_TIME_VERSION, NORMAL;
}

/**
 * The app version code (not the version name!) that was used on the last
 * start of the app.
 */
private static final String LAST_APP_VERSION = "last_app_version";

/**
 * Finds out started for the first time (ever or in the current version).<br/>
 * <br/>
 * Note: This method is <b>not idempotent</b> only the first call will
 * determine the proper result. Any subsequent calls will only return
 * {@link AppStart#NORMAL} until the app is started again. So you might want
 * to consider caching the result!
 * 
 * @return the type of app start
 */
public AppStart checkAppStart() {
    PackageInfo pInfo;
    SharedPreferences sharedPreferences = PreferenceManager
            .getDefaultSharedPreferences(this);
    AppStart appStart = AppStart.NORMAL;
    try {
        pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        int lastVersionCode = sharedPreferences
                .getInt(LAST_APP_VERSION, -1);
        int currentVersionCode = pInfo.versionCode;
        appStart = checkAppStart(currentVersionCode, lastVersionCode);
        // Update version in preferences
        sharedPreferences.edit()
                .putInt(LAST_APP_VERSION, currentVersionCode).commit();
    } catch (NameNotFoundException e) {
        Log.w(Constants.LOG,
                "Unable to determine current app version from pacakge manager. Defenisvely assuming normal app start.");
    }
    return appStart;
}

public AppStart checkAppStart(int currentVersionCode, int lastVersionCode) {
    if (lastVersionCode == -1) {
        return AppStart.FIRST_TIME;
    } else if (lastVersionCode < currentVersionCode) {
        return AppStart.FIRST_TIME_VERSION;
    } else if (lastVersionCode > currentVersionCode) {
        Log.w(Constants.LOG, "Current version code (" + currentVersionCode
                + ") is less then the one recognized on last startup ("
                + lastVersionCode
                + "). Defenisvely assuming normal app start.");
        return AppStart.NORMAL;
    } else {
        return AppStart.NORMAL;
    }
}

สามารถใช้จากกิจกรรมเช่นนี้:

public class MainActivity extends Activity {        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        switch (checkAppStart()) {
        case NORMAL:
            // We don't want to get on the user's nerves
            break;
        case FIRST_TIME_VERSION:
            // TODO show what's new
            break;
        case FIRST_TIME:
            // TODO show a tutorial
            break;
        default:
            break;
        }

        // ...
    }
    // ...
}

ตรรกะพื้นฐานสามารถตรวจสอบได้โดยใช้การทดสอบ JUnit นี้:

public void testCheckAppStart() {
    // First start
    int oldVersion = -1;
    int newVersion = 1;
    assertEquals("Unexpected result", AppStart.FIRST_TIME,
            service.checkAppStart(newVersion, oldVersion));

    // First start this version
    oldVersion = 1;
    newVersion = 2;
    assertEquals("Unexpected result", AppStart.FIRST_TIME_VERSION,
            service.checkAppStart(newVersion, oldVersion));

    // Normal start
    oldVersion = 2;
    newVersion = 2;
    assertEquals("Unexpected result", AppStart.NORMAL,
            service.checkAppStart(newVersion, oldVersion));
}

ด้วยความพยายามอีกเล็กน้อยคุณอาจทดสอบสิ่งที่เกี่ยวข้องกับ Android (PackageManager และ SharedPreferences) ได้เช่นกัน ทุกคนที่สนใจในการเขียนการทดสอบ? :)

โปรดทราบว่าโค้ดด้านบนจะทำงานได้อย่างถูกต้องก็ต่อเมื่อคุณไม่ยุ่งกับของคุณandroid:versionCodeใน AndroidManifest.xml!


2
กรุณาอธิบายวิธีใช้วิธีนี้ คุณกำลังเริ่มต้นอ็อบเจ็กต์ SharedPreferences ที่ใด
Shajeel Afzal

1
ไม่ได้ผลสำหรับฉัน - มันมักจะเปิดการสอนครั้งแรกของฉัน
pzo

1
รหัสนี้ตรงไปตรงมามากขึ้นโดยไม่มีผลข้างเคียงของการประกาศบริบทและการตั้งค่าอื่น ๆpublic AppStart checkAppStart(Context context, SharedPreferences sharedPreferences)เป็นลายเซ็นวิธีการที่ดีกว่ามาก
จะ

2
ทำการอัปเดตส่วนสำคัญของคำตอบนี้ที่นี่gist.github.com/williscool/2a57bcd47a206e980eeeฉันมีปัญหากับรหัสดั้งเดิมซึ่งจะติดอยู่ในลูปคำแนะนำตลอดไปเนื่องจากหมายเลขเวอร์ชันไม่เคยถูกคำนวณใหม่ในcheckAppStartบล็อกแรก ดังนั้นฉันจึงตัดสินใจแบ่งปันรหัสที่อัปเดตของฉันและดูว่าใครมีข้อเสนอแนะเกี่ยวกับเรื่องนี้
จะ

1
@ จะขอบคุณสำหรับข้อมูลของคุณ คุณพูดถูกรหัสสามารถทำให้ง่ายขึ้นและทำให้มีประสิทธิภาพมากขึ้น เมื่อฉันโพสต์คำตอบครั้งแรกฉันดึงโค้ดจากสถานการณ์ที่ซับซ้อนมากขึ้นซึ่งฉันต้องการเข้าถึงAppStartจากกิจกรรมต่างๆ ดังนั้นฉันจึงใส่ตรรกะในวิธีการบริการแยกต่างหาก นั่นเป็นเหตุผลที่มีcontextตัวแปรและAppStartถูกเก็บไว้ในตัวแปรคงที่เพื่ออำนวยความสะดวกในการเรียกเมธอด idempotent
ช่างตัดเสื้อ

4

ฉันแก้ไขเพื่อตรวจสอบว่าแอปพลิเคชันเป็นครั้งแรกของคุณหรือไม่ขึ้นอยู่กับว่าเป็นการอัปเดต

private int appGetFirstTimeRun() {
    //Check if App Start First Time
    SharedPreferences appPreferences = getSharedPreferences("MyAPP", 0);
    int appCurrentBuildVersion = BuildConfig.VERSION_CODE;
    int appLastBuildVersion = appPreferences.getInt("app_first_time", 0);

    //Log.d("appPreferences", "app_first_time = " + appLastBuildVersion);

    if (appLastBuildVersion == appCurrentBuildVersion ) {
        return 1; //ya has iniciado la appp alguna vez

    } else {
        appPreferences.edit().putInt("app_first_time",
                appCurrentBuildVersion).apply();
        if (appLastBuildVersion == 0) {
            return 0; //es la primera vez
        } else {
            return 2; //es una versión nueva
        }
    }
}

ผลการคำนวณ:

  • 0: ถ้านี่เป็นครั้งแรก
  • 1: มันเริ่มต้นขึ้นแล้ว
  • 2: มีการเริ่มต้นครั้งเดียว แต่ไม่ใช่เวอร์ชันนั้นกล่าวคือเป็นการอัปเดต

3

คุณสามารถใช้SharedPreferences Android

Android SharedPreferences ช่วยให้เราสามารถจัดเก็บข้อมูลแอปพลิเคชันดั้งเดิมส่วนตัวในรูปแบบของคู่คีย์ - ค่า

รหัส

สร้างคลาสที่กำหนดเองSharedPreference

 public class SharedPreference {

    android.content.SharedPreferences pref;
    android.content.SharedPreferences.Editor editor;
    Context _context;
    private static final String PREF_NAME = "testing";

    // All Shared Preferences Keys Declare as #public
    public static final String KEY_SET_APP_RUN_FIRST_TIME       =        "KEY_SET_APP_RUN_FIRST_TIME";


    public SharedPreference(Context context) // Constructor
    {
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, 0);
        editor = pref.edit();

    }

    /*
    *  Set Method Generally Store Data;
    *  Get Method Generally Retrieve Data ;
    * */


    public void setApp_runFirst(String App_runFirst)
    {
        editor.remove(KEY_SET_APP_RUN_FIRST_TIME);
        editor.putString(KEY_SET_APP_RUN_FIRST_TIME, App_runFirst);
        editor.apply();
    }

    public String getApp_runFirst()
    {
        String  App_runFirst= pref.getString(KEY_SET_APP_RUN_FIRST_TIME, "FIRST");
        return  App_runFirst;
    }

}

ตอนนี้เปิดของคุณกิจกรรมและการเริ่มต้น

 private     SharedPreference                sharedPreferenceObj; // Declare Global

ตอนนี้เรียกสิ่งนี้ในส่วนOnCreate

 sharedPreferenceObj=new SharedPreference(YourActivity.this);

กำลังตรวจสอบ

if(sharedPreferenceObj.getApp_runFirst().equals("FIRST"))
 {
   // That's mean First Time Launch
   // After your Work , SET Status NO
   sharedPreferenceObj.setApp_runFirst("NO");
 }
else
 { 
   // App is not First Time Launch
 }

2

นี่คือรหัสบางส่วนสำหรับสิ่งนี้ -

String path = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/Android/data/myapp/files/myfile.txt";

boolean exists = (new File(path)).exists(); 

if (!exists) {
    doSomething();                                      
}
else {
    doSomethingElse();
}

2

มีการสนับสนุนสิ่งนี้ในการแก้ไขไลบรารีการสนับสนุน 23.3.0 (ใน v4 ซึ่งหมายถึงความสามารถในการกลับไปใช้ Android 1.6)

ในกิจกรรม Launcher ของคุณโทรครั้งแรก:

AppLaunchChecker.onActivityCreate(activity);

จากนั้นโทร:

AppLaunchChecker.hasStartedFromLauncher(activity);

ซึ่งจะกลับมาหากนี่เป็นครั้งแรกที่เปิดตัวแอป


ลำดับของการเรียกเหล่านี้จะต้องย้อนกลับเมื่อ AppLaunchChecker.onActivityCreate () ถูกเรียกแล้ว AppLaunchChecker.hasStartedFromLauncher () จะคืนค่าจริง
Gary Kipnis

สิ่งนี้ค่อนข้างทำให้เข้าใจผิด ไม่ได้บอกว่าแอป "เคยเปิดตัว" หรือไม่ แต่เป็นการบอกว่าแอป "เคยเปิดตัวโดยผู้ใช้จากตัวเรียกใช้งาน" หรือไม่ ดังนั้นจึงมีความเป็นไปได้ที่แอปอื่น ๆ หรือลิงก์ในรายละเอียดอาจเปิดตัวแอปไปแล้ว
Farid

1

คุณสามารถตรวจสอบการมีอยู่ของไฟล์ว่างหากไม่มีอยู่ให้รันโค้ดของคุณและสร้างไฟล์

เช่น

if(File.Exists("emptyfile"){
    //Your code here
    File.Create("emptyfile");
}

ฉันคิดจะทำอย่างนั้น แต่คิดว่าต้องมีวิธีที่ดีกว่านี้
Boardy

ฉันไม่รู้เลย แต่ขาดทรัพยากรที่คุณได้รับจากสิ่งนั้นคืออะไร? 4 ไบต์สำหรับไฟล์และหนึ่ง "if" ที่จุดเริ่มต้น กิจวัตรของระบบจะทำเช่นเดียวกันพวกเขาจะทำเหมือนกันทุก
ประการ

ในลักษณะเดียวกันคุณสามารถใช้ sharedpreferences ซึ่งหากไม่มีอยู่คุณจะแสดงหน้าจอเริ่มต้นและอื่น ๆ ... และสร้างขึ้นเมื่อเรียกใช้โปรแกรมครั้งแรก (obv หลังจากตรวจสอบแล้ว) ดูคำตอบของ Kevin ด้านบน
stealthcopter

1

ฉันสร้างคลาสง่ายๆเพื่อตรวจสอบว่าโค้ดของคุณทำงานเป็นครั้งแรกหรือไม่ / n-times!

ตัวอย่าง

สร้างความชอบที่ไม่เหมือนใคร

FirstTimePreference prefFirstTime = new FirstTimePreference(getApplicationContext());

ใช้ runTheFirstTime เลือกคีย์เพื่อตรวจสอบเหตุการณ์ของคุณ

if (prefFirstTime.runTheFirstTime("myKey")) {
    Toast.makeText(this, "Test myKey & coutdown: " + prefFirstTime.getCountDown("myKey"),
                   Toast.LENGTH_LONG).show();
}

ใช้ runTheFirstNTimes เลือกคีย์และจำนวนครั้งที่ดำเนินการ

if(prefFirstTime.runTheFirstNTimes("anotherKey" , 5)) {
    Toast.makeText(this, "ciccia Test coutdown: "+ prefFirstTime.getCountDown("anotherKey"),
                   Toast.LENGTH_LONG).show();
}
  • ใช้ getCountDown () เพื่อจัดการโค้ดของคุณได้ดีขึ้น

FirstTimePreference.java


1

หากคุณกำลังมองหาวิธีง่ายๆนี่คือ

สร้างคลาสยูทิลิตี้เช่นนี้

public class ApplicationUtils {

  /**
  * Sets the boolean preference value
  *
  * @param context the current context
  * @param key     the preference key
  * @param value   the value to be set
  */
 public static void setBooleanPreferenceValue(Context context, String key, boolean value) {
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
     sp.edit().putBoolean(key, value).apply();
 }

 /**
  * Get the boolean preference value from the SharedPreference
  *
  * @param context the current context
  * @param key     the preference key
  * @return the the preference value
  */
 public static boolean getBooleanPreferenceValue(Context context, String key) {
     SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
     return sp.getBoolean(key, false);
 }

}

ที่กิจกรรมหลักของคุณ onCreate ()

if(!ApplicationUtils.getBooleanPreferenceValue(this,"isFirstTimeExecution")){
Log.d(TAG, "First time Execution");
ApplicationUtils.setBooleanPreferenceValue(this,"isFirstTimeExecution",true);
// do your first time execution stuff here,
}

1

สำหรับ kotlin

    fun checkFirstRun() {

    var prefs_name = "MyPrefsFile"
    var pref_version_code_key = "version_code"
    var doesnt_exist: Int = -1;

    // Get current version code
    var currentVersionCode = BuildConfig.VERSION_CODE

    // Get saved version code
    var prefs: SharedPreferences = getSharedPreferences(prefs_name, MODE_PRIVATE)
    var savedVersionCode: Int = prefs.getInt(pref_version_code_key, doesnt_exist)

    // Check for first run or upgrade
    if (currentVersionCode == savedVersionCode) {

        // This is just a normal run
        return;

    } else if (savedVersionCode == doesnt_exist) {

        // TODO This is a new install (or the user cleared the shared preferences)


    } else if (currentVersionCode > savedVersionCode) {

        // TODO This is an upgrade
    }

    // Update the shared preferences with the current version code
    prefs.edit().putInt(pref_version_code_key, currentVersionCode).apply();

}

ขอบคุณมากที่ให้คำตอบใน Kotlin
MMG

0

ทำไมไม่ใช้ตัวช่วยฐานข้อมูล สิ่งนี้จะมี onCreate ที่ดีซึ่งเรียกว่าครั้งแรกที่เริ่มแอปเท่านั้น สิ่งนี้จะช่วยให้ผู้ที่ต้องการติดตามสิ่งนี้หลังจากที่มีการติดตั้งแอปเริ่มต้นโดยไม่มีการติดตาม


สร้างฐานข้อมูลหรือไม่ จะใช้ DatabaseHelper โดยไม่ต้องสร้างฐานข้อมูลจริงได้อย่างไร? และฉันคิดว่าonCreate()มันถูกเรียกสำหรับเวอร์ชันใหม่ทุกครั้ง นอกจากนี้จะไม่ถือว่าฟุ่มเฟือยหรือใช้บางอย่างเพื่อวัตถุประสงค์ที่ไม่ได้ตั้งใจหรือไม่?
ADTC

onCreate จะถูกทริกเกอร์เมื่อติดตั้งแอพในครั้งแรกเท่านั้น เมื่อเวอร์ชันฐานข้อมูลเพิ่มขึ้นระบบจะทริกเกอร์ onUpdated
slott

ฟุ่มเฟือยเป็นคำที่รุนแรง :) - หากคุณมีตัวเลือกเช่น แอปของคุณยังไม่พร้อมใช้งานให้ตั้งค่าสถานะ SharedPrefs และใช้เพื่อตรวจสอบว่าเป็นการบูตครั้งแรกหรือไม่ ฉันมีกรณีที่แอปอยู่ในป่ามาระยะหนึ่งและเราใช้ฐานข้อมูลดังนั้น onCreate จึงเหมาะกับฉัน
slott

0

ฉันต้องการ "จำนวนการอัปเดต" ในค่ากำหนดที่ใช้ร่วมกันของฉัน หากไม่มี (หรือค่าศูนย์เริ่มต้น) นี่คือ "การใช้งานครั้งแรก" ของแอปของฉัน

private static final int UPDATE_COUNT = 1;    // Increment this on major change
...
if (sp.getInt("updateCount", 0) == 0) {
    // first use
} else if (sp.getInt("updateCount", 0) < UPDATE_COUNT) {
    // Pop up dialog telling user about new features
}
...
sp.edit().putInt("updateCount", UPDATE_COUNT);

ตอนนี้เมื่อใดก็ตามที่มีการอัปเดตแอปที่ผู้ใช้ควรทราบฉันจะเพิ่ม UPDATE_COUNT


-1
    /**
     * @author ALGO
     */
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    import java.util.UUID;

    import android.content.Context;

    public class Util {
        // ===========================================================
        //
        // ===========================================================

        private static final String INSTALLATION = "INSTALLATION";

        public synchronized static boolean isFirstLaunch(Context context) {
            String sID = null;
            boolean launchFlag = false;
            if (sID == null) {
                File installation = new File(context.getFilesDir(), INSTALLATION);
                try {
                    if (!installation.exists()) {

                        writeInstallationFile(installation);
                    }
                    sID = readInstallationFile(installation);
launchFlag = true;
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
            return launchFlag;
        }

        private static String readInstallationFile(File installation) throws IOException {
            RandomAccessFile f = new RandomAccessFile(installation, "r");// read only mode
            byte[] bytes = new byte[(int) f.length()];
            f.readFully(bytes);
            f.close();

            return new String(bytes);
        }

        private static void writeInstallationFile(File installation) throws IOException {
            FileOutputStream out = new FileOutputStream(installation);
            String id = UUID.randomUUID().toString();
            out.write(id.getBytes());
            out.close();
        }
    }

> Usage (in class extending android.app.Activity)

Util.isFirstLaunch(this);

-2

สวัสดีครับผมกำลังทำอะไรแบบนี้ และมันใช้ได้ผลสำหรับฉัน

สร้างฟิลด์บูลีนในการกำหนดค่าตามความชอบที่ใช้ร่วมกันค่าเริ่มต้นเป็นจริง {isFirstTime: true} หลังจากครั้งแรกตั้งค่าเป็นเท็จ ไม่มีอะไรจะง่ายและน่าเชื่อถือไปกว่านี้ในระบบ Android


เอ่ออย่าฮาร์ดโค้ดเส้นทางแบบนั้นสิ! ถ้าคุณทำContext.getSharedPreferences()มันจะจบลงในที่เดียวกันยกเว้นว่าจะใช้ได้ทุกที่
Takhion

เห็นด้วยกับคุณ :)
DropAndTrap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.