আমি বর্তমানে একটি অ্যান্ড্রয়েড অ্যাপ বিকাশ করছি। অ্যাপটি প্রথমবার চালু হওয়ার সময় আমার কিছু করা দরকার, অর্থাৎ কোডটি প্রথমবার প্রোগ্রাম চালু হওয়ার পরে চালিত হয়।
আমি বর্তমানে একটি অ্যান্ড্রয়েড অ্যাপ বিকাশ করছি। অ্যাপটি প্রথমবার চালু হওয়ার সময় আমার কিছু করা দরকার, অর্থাৎ কোডটি প্রথমবার প্রোগ্রাম চালু হওয়ার পরে চালিত হয়।
উত্তর:
আর একটি ধারণা ভাগ করা পছন্দসমূহে একটি সেটিংস ব্যবহার করা। খালি ফাইলের জন্য যাচাই করা একই সাধারণ ধারণা, তবে তারপরে আপনার কাছে কোনও ফাঁকা ফাইল ভাসমান নয়, কোনও কিছু সঞ্চয় করার জন্য ব্যবহৃত হচ্ছে না
আপনি যদি প্রথমবারের মতো অ্যাপ্লিকেশনটি চালু হয় তবে এটি সনাক্ত করতে আপনি ভাগ করে নেওয়া পছন্দগুলি ব্যবহার করতে পারেন । শুধু একটি ব্যবহার বুলিয়ান পরিবর্তনশীল ( "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();
}
আমি প্রস্তাব দিচ্ছি যে কেবলমাত্র একটি বুলিয়ান পতাকা সংরক্ষণ করা হবে না, তবে সম্পূর্ণ সংস্করণ কোড। আপনি যদি নতুন সংস্করণে এটি প্রথম শুরু করেন তবে আপনি শুরুতেও জিজ্ঞাসা করতে পারেন। উদাহরণস্বরূপ, আপনি "হোয়াটস নিউ" ডায়ালগটি প্রদর্শন করতে এই তথ্যটি ব্যবহার করতে পারেন।
নিম্নলিখিত কোডটি এমন কোনও অ্যান্ড্রয়েড শ্রেণীর থেকে কাজ করা উচিত যা "একটি প্রসঙ্গ" (ক্রিয়াকলাপ, পরিষেবা, ...)। আপনি যদি এটি পৃথক (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));
}
আরও কিছুটা চেষ্টা করে আপনি সম্ভবত অ্যান্ড্রয়েড সম্পর্কিত স্টাফ (প্যাকেজম্যানেজার এবং SharedPreferences) পরীক্ষা করতে পারেন। পরীক্ষা লিখতে আগ্রহী কেউ? :)
নোট করুন যে উপরের কোডটি কেবলমাত্র সঠিকভাবে কাজ করবে যদি আপনি android:versionCodeঅ্যান্ড্রয়েডম্যানিফেস্ট.এক্সএমএলটিতে ঘোরাঘুরি না করেন!
public AppStart checkAppStart(Context context, SharedPreferences sharedPreferences)অনেক ভালো পদ্ধতি স্বাক্ষর হয়
checkAppStartব্লকে কখনও পুনরায় গণনা করা হয়নি । তাই আমি আমার আপডেট কোড ভাগ এবং দেখি কেউ এটা সম্পর্কে পরামর্শ করার সিদ্ধান্ত নিয়েছে
AppStartবিভিন্ন ক্রিয়াকলাপ থেকে অ্যাক্সেস করতে চেয়েছিলাম । সুতরাং আমি যুক্তিকে একটি পৃথক পরিষেবা পদ্ধতিতে রেখেছি। এ কারণেই একটি contextপরিবর্তনশীল AppStartছিল এবং আদর্শ পন্থা কলগুলির সুবিধার্থে একটি স্ট্যাটিক ভেরিয়েবলের মধ্যে সংরক্ষণ করা হয়েছিল।
আমি অ্যাপ্লিকেশনটি আপনার প্রথমবার কিনা তা নির্ধারণের সমাধান করেছি, এটি আপডেট কিনা তা নির্ভর করে।
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
}
}
}
গণনার ফলাফল:
আপনি Android SharedPreferences ব্যবহার করতে পারেন ।
Android SharedPreferences আমাদের কী-মান জুটির আকারে ব্যক্তিগত আদিম অ্যাপ্লিকেশন ডেটা সংরক্ষণ করার অনুমতি দেয়।
কোড
একটি কাস্টম শ্রেণি ভাগ করা পছন্দ তৈরি করুন
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
এখন এটি অনক্রিয়েট বিভাগে কল করুন
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
}
এর জন্য এখানে কিছু কোড দেওয়া হয়েছে -
String path = Environment.getExternalStorageDirectory().getAbsolutePath() +
"/Android/data/myapp/files/myfile.txt";
boolean exists = (new File(path)).exists();
if (!exists) {
doSomething();
}
else {
doSomethingElse();
}
আপনি কেবল খালি ফাইলের অস্তিত্বের জন্য যাচাই করতে পারেন, যদি এটি উপস্থিত না থাকে, তবে আপনার কোডটি কার্যকর করুন এবং ফাইলটি তৈরি করুন।
যেমন
if(File.Exists("emptyfile"){
//Your code here
File.Create("emptyfile");
}
আপনার কোডটি প্রথমবার / এন-বারের জন্য চলছে কিনা তা পরীক্ষা করার জন্য আমি একটি সাধারণ ক্লাস করেছি!
উদাহরণ
একটি অনন্য পছন্দ তৈরি করুন
FirstTimePreference prefFirstTime = new FirstTimePreference(getApplicationContext());
রানআউটফার্সটাইম ব্যবহার করুন, আপনার ইভেন্টটি পরীক্ষা করতে একটি কী চয়ন করুন
if (prefFirstTime.runTheFirstTime("myKey")) {
Toast.makeText(this, "Test myKey & coutdown: " + prefFirstTime.getCountDown("myKey"),
Toast.LENGTH_LONG).show();
}
رنফটফর্સ્ટএনটাইমস ব্যবহার করুন, একটি কী চয়ন করুন এবং কতবার চালিত করবেন
if(prefFirstTime.runTheFirstNTimes("anotherKey" , 5)) {
Toast.makeText(this, "ciccia Test coutdown: "+ prefFirstTime.getCountDown("anotherKey"),
Toast.LENGTH_LONG).show();
}
সমর্থন লাইব্রেরি রিভিশন ২৩.৩.০ এ এটির জন্য সমর্থন রয়েছে (ভি 4 তে যার অর্থ অ্যান্ড্রয়েড 1.6 এ ফিরে আসার ক্ষমতা রয়েছে)।
আপনার লঞ্চার ক্রিয়াকলাপে, প্রথম কল করুন:
AppLaunchChecker.onActivityCreate(activity);
তারপরে কল করুন:
AppLaunchChecker.hasStartedFromLauncher(activity);
এটি প্রথমবারের মতো অ্যাপ্লিকেশন চালু করা হলে কোনটি ফিরে আসবে।
আপনি যদি একটি সহজ উপায় সন্ধান করেন তবে এটি এখানে।
এর মতো একটি ইউটিলিটি ক্লাস তৈরি করুন,
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);
}
}
আপনার মূল ক্রিয়াকলাপে, অনক্রিট ()
if(!ApplicationUtils.getBooleanPreferenceValue(this,"isFirstTimeExecution")){
Log.d(TAG, "First time Execution");
ApplicationUtils.setBooleanPreferenceValue(this,"isFirstTimeExecution",true);
// do your first time execution stuff here,
}
কোটলিনের জন্য
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();
}
কেন ডেটাবেস হেল্পার ব্যবহার করবেন না? এটিতে একটি দুর্দান্ত অনক্রিট থাকবে যা কেবলমাত্র প্রথমবার অ্যাপ্লিকেশন শুরু হওয়ার পরে বলা হয়। এটি ট্র্যাকিং ছাড়াই প্রাথমিক অ্যাপটি ইনস্টল করার পরে যারা এই ট্র্যাক করতে চান তাদের সহায়তা করবে।
onCreate()প্রতিটি নতুন সংস্করণ জন্য বলা হয়। এছাড়াও, এটি অনাবশ্যক বা অযৌক্তিক উদ্দেশ্যে কিছু ব্যবহার করা হবে না?
আমি আমার ভাগ করা পছন্দগুলিতে একটি "আপডেট কাউন্ট" রাখতে চাই। যদি এটি না থাকে (বা ডিফল্ট শূন্য মান) তবে এটি আমার অ্যাপ্লিকেশনটির "প্রথম ব্যবহার"।
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 বৃদ্ধি করি
/**
* @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);
হাই বন্ধুরা আমি এই জাতীয় কিছু করছি। এবং এটি আমার জন্য কাজ করে
ভাগ করা পছন্দসইগুলিতে একটি বুলিয়ান ক্ষেত্র তৈরি করুন ef ডিফল্ট মানটি প্রথমবারের পরে এটি মিথ্যাতে সেট করার পরে সত্য {হয় ফার্স্টটাইম: সত্য is এন্ড্রয়েড সিস্টেমে এর চেয়ে সহজ কিছুই আর সম্পর্কিত হতে পারে না।
Context.getSharedPreferences()এটি করেন তবে এটি একই জায়গায় শেষ হবে, কেবল এটি সর্বত্র কাজ করবে