我是Android开发的新手,我想在安装后首先根据应用程序设置一些应用程序的属性。有没有办法找到应用程序第一次运行,然后设置其第一个运行属性?
答案 0 :(得分:224)
以下是使用SharedPreferences
进行“首次运行”检查的示例。
public class MyActivity extends Activity {
SharedPreferences prefs = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Perhaps set content view here
prefs = getSharedPreferences("com.mycompany.myAppName", MODE_PRIVATE);
}
@Override
protected void onResume() {
super.onResume();
if (prefs.getBoolean("firstrun", true)) {
// Do first run stuff here then set 'firstrun' as false
// using the following line to edit/commit prefs
prefs.edit().putBoolean("firstrun", false).commit();
}
}
}
当代码运行prefs.getBoolean(...)
时,如果boolean
中没有SharedPreferences
保存,并且密钥为“firstrun”,则表明应用程序从未运行过(因为没有任何内容)使用该键保存了一个布尔值,或者用户已清除应用程序数据以强制执行“首次运行”方案。如果这不是第一次运行,则行prefs.edit().putBoolean("firstrun", false).commit();
将被执行,因此prefs.getBoolean("firstrun", true)
实际上将返回false,因为它会覆盖作为第二个参数提供的默认true。
答案 1 :(得分:102)
接受的答案不区分首次运行和后续升级。只需在共享首选项中设置布尔值,只会告诉您它是否是首次安装应用后的首次运行。稍后如果您想要升级您的应用并在第一次升级时进行一些更改,您将无法再使用该布尔值,因为共享首选项会在升级过程中保存。
此方法使用共享首选项来保存版本代码而不是布尔值。
import com.yourpackage.BuildConfig;
...
private void checkFirstRun() {
final String PREFS_NAME = "MyPrefsFile";
final String PREF_VERSION_CODE_KEY = "version_code";
final int DOESNT_EXIST = -1;
// Get current version code
int currentVersionCode = BuildConfig.VERSION_CODE;
// Get saved version code
SharedPreferences prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
int savedVersionCode = 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();
}
您可能会在主活动中从onCreate
调用此方法,以便每次应用启动时都会对其进行检查。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkFirstRun();
}
private void checkFirstRun() {
// ...
}
}
如果需要,您可以根据用户之前安装的版本调整代码以执行特定操作。
想法来自this answer。这些也很有帮助:
如果您在获取版本代码时遇到问题,请参阅以下Q& A:
答案 2 :(得分:5)
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()) {
launchFlag = true;
writeInstallationFile(installation);
}
sID = readInstallationFile(installation);
} 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);
答案 3 :(得分:4)
通过Android API无法知道。您必须自己存储一些标志,并使其在SharedPreferenceEditor
或使用数据库中保留。
如果你想在这个标志上建立一些与许可证相关的东西,我建议你使用LVL库提供的混淆的偏好编辑器。它简单而干净。
此致 斯蒂芬
答案 4 :(得分:3)
只需检查一些偏好,并使用默认值表示它是第一次运行。因此,如果您获得默认值,请进行初始化并将此首选项设置为不同的值,以指示应用程序已初始化。
答案 5 :(得分:3)
以下是使用SharedPreferences实现'forWhat'检查的示例。
preferences = PreferenceManager.getDefaultSharedPreferences(context);
preferencesEditor = preferences.edit();
public static boolean isFirstRun(String forWhat) {
if (preferences.getBoolean(forWhat, true)) {
preferencesEditor.putBoolean(forWhat, false).commit();
return true;
} else {
return false;
}
}
答案 6 :(得分:2)
没有可靠的方法来检测首次运行,因为共享首选项方式并不总是安全的,用户可以从设置中删除共享首选项数据! 更好的方法是使用此处的答案Is there a unique Android device ID?获取设备的唯一ID并将其存储在服务器中的某个位置,因此每当用户启动应用程序时,您都会请求服务器并检查它是否为“服务器”。在您的数据库中,它是新的。
答案 7 :(得分:2)
我不确定这是检查它的好方法。如果用户使用按钮"清除数据"从设置? SharedPreferences将被清除,你赶上"首先运行"再次。这是一个问题。我想最好使用 InstallReferrerReceiver 。
答案 8 :(得分:1)
SharedPreferences mPrefs;
final String welcomeScreenShownPref = "welcomeScreenShown";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPrefs = PreferenceManager.getDefaultSharedPreferences(this);
// second argument is the default to use if the preference can't be found
Boolean welcomeScreenShown = mPrefs.getBoolean(welcomeScreenShownPref, false);
if (!welcomeScreenShown) {
// here you can launch another activity if you like
SharedPreferences.Editor editor = mPrefs.edit();
editor.putBoolean(welcomeScreenShownPref, true);
editor.commit(); // Very important to save the preference
}
}
答案 9 :(得分:0)
这可能对您有所帮助
public class FirstActivity extends Activity {
SharedPreferences sharedPreferences = null;
Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
sharedPreferences = getSharedPreferences("com.myAppName", MODE_PRIVATE);
}
@Override
protected void onResume() {
super.onResume();
if (sharedPreferences.getBoolean("firstRun", true)) {
//You can perform anything over here. This will call only first time
editor = sharedPreferences.edit();
editor.putBoolean("firstRun", false)
editor.commit();
}
}
}