Java 在应用程序安装时设置唯一ID-Android

Java 在应用程序安装时设置唯一ID-Android,java,android,installation,uuid,Java,Android,Installation,Uuid,我正在尝试实现下面的代码,以便在安装应用程序时为用户生成一个随机ID号。我只是有几个问题 如果我为此创建了一个新文件(Install.java),我如何访问另一个类中的ID 如何确保在首次安装应用程序时执行程序的这一部分?现在,程序从我的Main.java类开始(我是java新手)。它会在安装应用程序时运行吗 public class Install { private static String sID = null; private static final String INSTALLA

我正在尝试实现下面的代码,以便在安装应用程序时为用户生成一个随机ID号。我只是有几个问题

  • 如果我为此创建了一个新文件(Install.java),我如何访问另一个类中的ID
  • 如何确保在首次安装应用程序时执行程序的这一部分?现在,程序从我的Main.java类开始(我是java新手)。它会在安装应用程序时运行吗

    public class Install {
    
    private static String sID = null;
    private static final String INSTALLATION = "INSTALLATION";
    
    public synchronized static String id(Context context) {
        if (sID == null) {  
            File installation = new File(context.getFilesDir(), INSTALLATION);
            try {
                if (!installation.exists())
                    writeInstallationFile(installation);
                sID = readInstallationFile(installation);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return sID;
    }
    
    private static String readInstallationFile(File installation) throws IOException {
        RandomAccessFile f = new RandomAccessFile(installation, "r");
        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();
    }
    }
    

  • 据我所知,在安装完成后,您无法立即运行任意代码


    我认为最接近的方法是在MainActivity onCreate()方法中进行检查,以确定这是否是第一次运行(检查这一点的一个好方法可能是获取对文件的引用并调用file.exists(),生成的布尔值将告诉您是否需要创建UID文件。

    据我所知,您无法在安装完成后立即运行任意代码


    我认为最接近的方法是在MainActivity onCreate()方法中进行检查,以确定这是否是第一次运行(检查这一点的一个好方法可能是获取对文件的引用并调用file.exists(),生成的布尔值将告诉您是否需要创建UID文件。

    以下是我使用的一些代码-请随意调整

     public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        Log.d(Tag, "Yay onCreate!"); // sorry sometimes I'm a bit verbose with my logs...
        createVerifierStrings();
        .....
    
    
     private void createVerifierStrings() {
        SharedPreferences prefs = this.getSharedPreferences("Someprefstringreference", 0);
        String not_set = "NOTSET";
        String android_key;
        android_key = prefs.getString("id", not_set);
    
        if (android_key.equals(not_set)) {
            Log.d(Tag, "Creating keys for 1st time");
            android_key = generateRandomEnoughStuff();
            prefs.edit().putString("id", android_key).commit();
        }
        ......
    

    以下是我使用的一些代码-请随意调整

     public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        Log.d(Tag, "Yay onCreate!"); // sorry sometimes I'm a bit verbose with my logs...
        createVerifierStrings();
        .....
    
    
     private void createVerifierStrings() {
        SharedPreferences prefs = this.getSharedPreferences("Someprefstringreference", 0);
        String not_set = "NOTSET";
        String android_key;
        android_key = prefs.getString("id", not_set);
    
        if (android_key.equals(not_set)) {
            Log.d(Tag, "Creating keys for 1st time");
            android_key = generateRandomEnoughStuff();
            prefs.edit().putString("id", android_key).commit();
        }
        ......
    

    下面是Tim Bray的一篇博文,解释了你实际上应该做什么


    这是蒂姆·布雷(Tim Bray)的一篇博文,解释了你实际上应该做什么


    因此,如果您想将此逻辑保留在单独的类中,请将其包含在我的主要活动中,而不是单独的类中?或者将调用
    Install.id
    作为主要活动中的第一件事。(是的,我知道此注释已晚了6年)因此,如果您想将此逻辑保留在单独的类中,请将其包含在我的主要活动中,而不是单独的类中?或者将调用
    Install.id
    作为主要活动中的第一件事。(是的,我知道此注释迟了6年)我敦促您不要写入文件(您不知道所有品牌和型号的手机都提供哪些设备),但使用首选项或SharedReferences对象。除此之外,您还可以利用BackupManager,这样,如果用户在另一部手机上安装应用程序,BackupManager将跨任何存储的首选项复制到新手机上。@RichardGreen感谢您的回复。我现在正试图使用SharedReference实现此功能,但我没有这会给你带来很多麻烦。你能看看我的另一篇帖子,告诉我在哪里以及我将如何在给出的代码中实现它吗?这里有一个链接:我敦促你不要写文件(你不知道所有品牌和型号的手机都可以使用哪些设备),但使用首选项或SharedReferences对象。除此之外,您还可以利用BackupManager,这样,如果用户在另一部手机上安装应用程序,BackupManager将跨任何存储的首选项复制到新手机上。@RichardGreen感谢您的回复。我现在正试图使用SharedReference实现此功能,但我没有这会带来很多麻烦。你能看看我的另一篇文章,告诉我在哪里以及我将如何在给出的代码中实现它吗?这里有一个链接:只是添加-初始化时你不能生成字符串-你可以开始处理服务等,但你会过得更好(我认为)只是在应用程序第一次运行时这样做。只是要补充一点——你不能在初始化时生成字符串——好吧,你可以开始摆弄服务等,但你最好(我认为)在应用程序第一次运行时这样做。