Xác định xem ứng dụng Android có đang được sử dụng lần đầu tiên hay không


112

Tôi hiện đang phát triển một ứng dụng Android. Tôi cần làm gì đó khi ứng dụng được khởi chạy lần đầu tiên, tức là mã chỉ chạy trong lần đầu tiên chương trình được khởi chạy.


1
Khi tôi lần đầu tiên bắt đầu tạo ứng dụng, tôi chỉ nghĩ về lần chạy đầu tiên sau khi một ứng dụng được cài đặt. Sau đó, tôi nhận ra rằng tôi cũng cần phải xử lý và phân biệt các lần chạy đầu tiên sau khi nâng cấp. Câu trả lời của @ schnatterer bên dưới và câu trả lời của tôi ở đây cho biết cách thực hiện việc này. Hãy thận trọng với những câu trả lời không tính đến việc nâng cấp.
Suragch

@Suragch bạn đang hành động như một thói quen xấu để không mất nhiều nâng cấp vào tài khoản nhưng trong một số trường hợp giống như có một giới thiệu về ứng dụng bạn không muốn làm điều đó :)
creativecreatorormaybenot

@creativecreatorormaybenot, đó là sự thật. Đôi khi bạn chỉ quan tâm đến cài đặt ban đầu chứ không quan tâm đến những nâng cấp tiếp theo. Một boolean đơn giản là đủ cho những trường hợp đó. Tuy nhiên, điều gì sẽ xảy ra nếu một lúc nào đó trong tương lai bạn muốn thêm một phần giới thiệu khác cho người dùng hiện tại về tất cả các tính năng mới mà bạn vừa thêm vào trong bản cập nhật cuối cùng? Theo tôi, việc kiểm tra số phiên bản là tầm nhìn xa hơn là kiểm tra boolean. Điều này ít nhất cung cấp cho bạn tùy chọn trong tương lai để phản hồi theo một cách cho cài đặt mới và một cách khác để nâng cấp.
Suragch

1
Sau đó, bạn chỉ cần thêm nó cho phiên bản này nhưng tôi nhận yoz
creativecreatorormaybenot

Bạn có thể kiểm tra điều này stackoverflow.com/a/7217834/2689076
Vaibhav

Câu trả lời:


56

Một ý tưởng khác là sử dụng cài đặt trong Tùy chọn chia sẻ. Ý tưởng chung giống như kiểm tra tệp trống, nhưng sau đó bạn không có tệp trống nào trôi nổi, không được sử dụng để lưu trữ bất kỳ thứ gì


3
Hãy cẩn thận rằng kiểu tiếp cận này không thể hoạt động trên Samsung Galaxy S với Android Froyo. Đó là do lỗi khi lưu SharedPreferences. Đây là liên kết đến một câu hỏi SO về vấn đề đó: stackoverflow.com/questions/7296163/… và đây là vé trên google code: code.google.com/p/android/issues/detail?id=14359
Francesco Rigoni

4
Lưu ý đối với Android 6.0 (API 23 - Marshmallow) trở lên tính năng tự động sao lưu ( developer.android.com/guide/topics/data/autobackup.html)được bật theo mặc định. Nếu người dùng gỡ cài đặt và sau đó cài đặt lại ứng dụng, các tùy chọn được chia sẻ sẽ được khôi phục. Vì vậy, khi cài đặt lại, bạn không thể kiểm tra xem nó có đang chạy lần đầu tiên sau khi cài đặt lại hay không nếu điều này là đáng lo ngại.
Alan

1
@Alan bạn đúng, câu trả lời này không còn hợp lệ từ Android Marshmallow.
Ioane Sharvadze

1
@Alan bạn không thể tưởng tượng được tôi đã tìm kiếm câu trả lời như của bạn trong bao lâu. Bạn đã làm nên ngày của tôi. Cảm ơn!
Antonio

@Alan Nhưng sao lưu tự động cũng tiết kiệm hầu hết các dữ liệu khác. Vì vậy, ứng dụng được cài đặt lại có thể dự kiến ​​sẽ ở trạng thái không chạy lần đầu. Và người dùng đã sử dụng ứng dụng trước đó, vì vậy không cần hướng dẫn. Vì vậy, tôi sẽ tranh luận cho hầu hết các trường hợp, điều này xảy ra là một điều tốt.
smdufb

112

Bạn có thể sử dụng SharedPreferences để xác định xem đó có phải là "Lần đầu tiên" ứng dụng được khởi chạy hay không. Chỉ cần sử dụng một biến Boolean ("my_first_time") và thay đổi giá trị của nó thành false khi nhiệm vụ của bạn "lần đầu tiên" kết thúc.

Đây là mã của tôi để nắm bắt lần đầu tiên bạn mở ứng dụng:

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
Nó sẽ xử lý khi ứng dụng sẽ được cập nhật lên phiên bản tiếp theo trên google play store?
Shajeel Afzal

4
SharedPreferences được duy trì trong quá trình nâng cấp. Vì vậy, tôi giả định rằng khi nó được nâng cấp từ PlayStore, giá trị cũ sẽ có sẵn. Trong thực tế, nó có thể áp dụng cho các phương pháp khác, tức là kiểm tra sự tồn tại của tệp. Vì vậy, phương pháp phím tắt trong trường hợp đó là sử dụng tùy chọn / tên tệp hoặc giá trị khác nhau.
Tejasvi Hegde,

@ShajeelAfzal một số thứ như thế này có thể giúp bạn công khai void CheckAndInitAppFirstTime () {final String PREFS_NAME = "TheAppVer"; Chuỗi cuối cùng CHECK_VERSION = "1"; // Bắt buộc ver ... final String KEY_NAME = "CheckVersion"; Cài đặt SharedPreferences = getSharedPreferences (PREFS_NAME, 0); if (! settings.getString (KEY_NAME, "0"). equals (CHECK_VERSION)) {// ứng dụng đang được khởi chạy lần đầu tiên, hãy làm gì đó hoặc CHECK_VERSION khác // ... settings.edit (). putString ( KEY_NAME, CHECK_VERSION) .commit (); }}
Tejasvi Hegde

@aman verma: theo mô tả getBoolean tại developer.android.com/reference/android/content/…, tham số thứ 2 của getBoolean là giá trị mặc định nếu tham số đầu tiên không thoát, vì vậy nếu "my_first_time" chưa được đặt biểu thức mặc định là true.
user2798692

62

Tôi đề nghị không chỉ lưu trữ cờ boolean mà còn cả mã phiên bản hoàn chỉnh. Bằng cách này, bạn cũng có thể truy vấn ngay từ đầu nếu đó là lần khởi động đầu tiên trong phiên bản mới. Ví dụ: bạn có thể sử dụng thông tin này để hiển thị hộp thoại "Whats mới".

Đoạn mã sau sẽ hoạt động từ bất kỳ lớp android nào "là ngữ cảnh" (các hoạt động, dịch vụ, ...). Nếu bạn muốn có nó trong một lớp (POJO) riêng biệt, bạn có thể cân nhắc sử dụng "ngữ cảnh tĩnh", chẳng hạn như được mô tả ở đây .

/**
 * 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;
    }
}

Nó có thể được sử dụng từ một hoạt động như thế này:

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;
        }

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

Logic cơ bản có thể được xác minh bằng cách sử dụng thử nghiệm JUnit này:

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));
}

Với một chút nỗ lực hơn nữa, bạn có thể có thể kiểm tra những thứ liên quan đến android (PackageManager và SharedPreferences). Có ai quan tâm đến việc viết bài kiểm tra không? :)

Lưu ý rằng đoạn mã trên sẽ chỉ hoạt động bình thường nếu bạn không làm phiền với android:versionCodeAndroidManifest.xml của mình!


2
Vui lòng giải thích cách sử dụng phương pháp này. Nơi bạn đang khởi tạo đối tượng SharedPreferences?
Shajeel Afzal

1
không hoạt động với tôi - nó luôn khởi chạy hướng dẫn lần đầu tiên của tôi
pzo

1
mã này rất dễ dàng về phía trước mà không có tác dụng phụ của việc khai báo ngữ cảnh và tùy chọn ở nơi khác public AppStart checkAppStart(Context context, SharedPreferences sharedPreferences)là một chữ ký phương pháp tốt hơn nhiều
Sẽ

2
Đã thực hiện cập nhật ý chính của câu trả lời này tại đây gist.github.com/williscool/2a57bcd47a206e980eee Tôi đã gặp sự cố với mã ban đầu, nơi nó sẽ bị mắc kẹt trong vòng lặp hướng dẫn của tôi mãi mãi vì số phiên bản không bao giờ được tính toán lại trong checkAppStartkhối đầu tiên . vì vậy tôi quyết định chia sẻ mã đã cập nhật của mình và xem liệu có ai có gợi ý về nó không
Sẽ

1
@Will cảm ơn vì đầu vào của bạn. Bạn nói đúng, mã có thể được đơn giản hóa và mạnh mẽ hơn. Khi lần đầu tiên tôi đăng câu trả lời, tôi đã trích xuất mã từ một kịch bản phức tạp hơn , nơi tôi muốn truy cập AppStarttừ các hoạt động khác nhau. Vì vậy, tôi đặt logic trong một phương pháp dịch vụ riêng biệt. Đó là lý do tại sao có một contextbiến và AppStartđược lưu trữ trong một biến tĩnh để tạo điều kiện cho các cuộc gọi phương thức Idempotent.
schnatterer

4

Tôi đã giải quyết để xác định xem ứng dụng có phải là lần đầu tiên của bạn hay không, tùy thuộc vào việc nó có phải là bản cập nhật hay không.

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
        }
    }
}

Tính toán kết quả:

  • 0: Nếu đây là lần đầu tiên.
  • 1: Nó đã bắt đầu từ bao giờ.
  • 2: Nó đã bắt đầu một lần, nhưng không phải phiên bản đó, tức là nó là một bản cập nhật.

3

Bạn có thể sử dụng Android SharedPreferences .

Android SharedPreferences cho phép chúng tôi lưu trữ dữ liệu ứng dụng nguyên thủy riêng tư dưới dạng cặp khóa-giá trị.

CODE

Tạo một lớp tùy chỉnh 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;
    }

}

Bây giờ hãy mở Hoạt động của bạn & Khởi tạo .

 private     SharedPreference                sharedPreferenceObj; // Declare Global

Bây giờ hãy gọi cái này trong phần OnCreate

 sharedPreferenceObj=new SharedPreference(YourActivity.this);

Đang kiểm tra

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

Đây là một số mã cho việc này -

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

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

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

1

Bạn có thể chỉ cần kiểm tra sự tồn tại của một tệp trống, nếu nó không tồn tại, sau đó thực thi mã của bạn và tạo tệp.

ví dụ

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

Tôi đã nghĩ đến việc làm điều đó nhưng nghĩ rằng phải có một cách tốt hơn
Boardy

Tôi không biết bất kỳ điều gì, nhưng thiếu nguồn cung cấp mà bạn nhận được là gì? 4 byte cho tệp và một "nếu" ở đầu. Hệ thống thói quen sẽ làm như vậy, họ sẽ làm giống hệt nhau hoặc thực hiện một bảng với các ứng dụng đã được lauched
MechMK1

Theo cách tương tự, bạn có thể sử dụng sharedpreferences, nếu nó không tồn tại, bạn sẽ hiển thị một màn hình giật gân, v.v ... và chỉ tạo nó khi chương trình được chạy lần đầu (obv sau khi kiểm tra nó). Xem câu trả lời của Kevin trên
stealthcopter

1

Tôi đã tạo một lớp đơn giản để kiểm tra xem mã của bạn có đang chạy lần đầu tiên không / n-lần!

Thí dụ

Tạo một sở thích riêng

FirstTimePreference prefFirstTime = new FirstTimePreference(getApplicationContext());

Sử dụng runTheFirstTime, chọn một khóa để kiểm tra sự kiện của bạn

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

Sử dụng runTheFirstNTimes, chọn một khóa và thực thi bao nhiêu lần

if(prefFirstTime.runTheFirstNTimes("anotherKey" , 5)) {
    Toast.makeText(this, "ciccia Test coutdown: "+ prefFirstTime.getCountDown("anotherKey"),
                   Toast.LENGTH_LONG).show();
}
  • Sử dụng getCountDown () để xử lý mã của bạn tốt hơn

FirstTimePreference.java


1

Chỉ hỗ trợ điều này trong bản sửa đổi thư viện hỗ trợ 23.3.0 (trong phiên bản v4 có nghĩa là khả năng tương thích trở lại Android 1.6).

Trong hoạt động Trình khởi chạy của bạn, trước tiên hãy gọi:

AppLaunchChecker.onActivityCreate(activity);

Sau đó gọi:

AppLaunchChecker.hasStartedFromLauncher(activity);

Điều này sẽ trở lại nếu đây là lần đầu tiên ứng dụng được khởi chạy.


Thứ tự của các lệnh gọi này phải được đảo ngược, khi AppLaunchChecker.onActivityCreate () đã được gọi, AppLaunchChecker.hasStartedFromLauncher () sẽ trả về true.
Gary Kipnis

Điều này là khá sai lầm. Nó không cho biết liệu ứng dụng đã được "khởi chạy" hay chưa; thay vào đó, nó cho biết liệu ứng dụng "đã từng được khởi chạy bởi người dùng từ trình khởi chạy chưa". Vì vậy, có khả năng các ứng dụng hoặc liên kết sâu khác có thể đã khởi chạy ứng dụng.
Farid

1

Nếu bạn đang tìm kiếm một cách đơn giản, đây là nó.

Tạo một lớp tiện ích như thế này,

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);
 }

}

Tại Hoạt động chính của bạn, 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

cho 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();

}

Cảm ơn bạn rất nhiều vì đã đưa ra câu trả lời trong Kotlin
MMG

0

Tại sao không sử dụng Trình trợ giúp cơ sở dữ liệu? Điều này sẽ có một onCreate tuyệt vời chỉ được gọi là lần đầu tiên ứng dụng được khởi động. Điều này sẽ giúp những người muốn theo dõi điều này sau khi ứng dụng ban đầu đã được cài đặt mà không cần theo dõi.


Điều đó có tạo ra một cơ sở dữ liệu không? Làm thế nào để sử dụng DatabaseHelper mà không cần tạo cơ sở dữ liệu thực tế? Và tôi nghĩ, onCreate()được gọi cho mọi phiên bản mới. Ngoài ra, nó sẽ không được coi là thừa hoặc sử dụng một cái gì đó cho mục đích ngoài ý muốn?
ADTC

onCreate chỉ được kích hoạt khi ứng dụng được cài đặt lần đầu tiên. Khi phiên bản db được tăng lên, onUpdated được kích hoạt.
slott

Vâng thừa là một từ khắc nghiệt như vậy :) - Nếu bạn có tùy chọn tức là. ứng dụng của bạn chưa hoạt động, sau đó thiết lập cờ SharedPrefs và sử dụng cờ đó để xác định xem đây có phải là lần khởi động đầu tiên hay không. Tôi đã gặp trường hợp ứng dụng đã tồn tại trong một thời gian dài và chúng tôi đang sử dụng DB vì vậy onCreate là một kết hợp hoàn hảo cho tôi.
slott

0

Tôi muốn có "số lượng cập nhật" trong tùy chọn được chia sẻ của mình. Nếu nó không ở đó (hoặc giá trị 0 mặc định) thì đây là "lần sử dụng đầu tiên" ứng dụng của tôi.

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);

Vì vậy, bây giờ, bất cứ khi nào có bản cập nhật cho ứng dụng mà người dùng nên biết, tôi tăng 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

Xin chào các bạn, tôi đang làm một việc như thế này. Và nó hoạt động với tôi

tạo trường Boolean trong tùy chọn chia sẻ. Giá trị mặc định là true {isFirstTime: true} sau lần đầu tiên đặt nó thành false. Không có gì có thể đơn giản và đáng tin cậy hơn điều này trong hệ thống Android.


Uh, đừng hardcode đường dẫn như vậy! Nếu bạn chỉ đơn giản làm điều Context.getSharedPreferences()đó sẽ kết thúc ở cùng một nơi, ngoại trừ nó sẽ hoạt động ở mọi nơi
Takhion

đồng ý với bạn :)
DropAndTrap
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.