onCreate — এটি কি, Android এ Activity আরম্ভ

লেখক: IT Sectr প্রকাশিত: 2026-03-03 পড়ার সময়: 10 মিনিট

onCreate হল Android এ Activity এবং Fragment জীবনচক্রের প্রথম এবং একমাত্র বাধ্যতামূলক পদ্ধতি। সিস্টেম একটি কম্পোনেন্ট তৈরি করার সময় একবার একে ডেকে, আগে সংরক্ষিত অবস্থা সহ Bundle প্যারামিটার পাশ করে। onCreate এর মধ্যে, ডিভেলপার যূজার ইন্টারফেস আরম্ভ করে, View উপাদান বাঁধে, ইভেন্ট হ্যান্ডলার কনফিগার করে এবং savedInstanceState থেকে ডাটা পুনরুদ্ধার করে। onCreate এর সঠিক বাস্তবায়ন ছাড়া কোনো Android অ্যাপ্লিকেশন চালু করা যায় না — এটি প্রতিটি স্ক্রিনের জন্য প্রবেশ বিন্দু। সাধারণ Activity জীবনচক্র সম্পর্কে আরও জানতে, নিবন্ধটি পড়ুন Activity Lifecycle.

মূখ্য বিষয়

  • onCreate — প্রথম এবং একমাত্র বাধ্যতামূলক জীবনচক্র পদ্ধতি; Activity বা Fragment তৈরি করার সময় একবার ডাকা হয়
  • Bundle প্যারামিটার — savedInstanceState এ onSaveInstanceState এ সংরক্ষিত ডাটা থাকে, বা null যদি Activity প্রথমবারের জন্য তৈরি হয়
  • setContentView — Activity এর জন্য onCreate এর মধ্যে বাধ্যতামূলক কল; XML লেআউট কোডের সাথে সংযুক্ত করে
  • UI আরম্ভ — findViewById, RecyclerView অ্যাডাপ্টার সেটআপ, ক্লিক শ্রোতা সেট করা — বৈশিষ্ট্যিক onCreate কাজ
  • Fragment.onCreate — Activity থেকে আলাদা: এখানে setContentView ডাকা হয় না, লেআউট onCreateView এর মাধ্যমে পাশ করা হয়
  • সময় সীমা — onCreate কে 5 সেকেন্ডের মধ্যে শেষ হতে হবে (ANR threshold), দীর্ঘ কাজ পশ্চাদ্ থ্রেডে সরানো হয়
  • ViewModel এবং onCreate — onCreate এ ViewModel আরম্ভ করা ডাটাকে স্ক্রিন ঘূর্ণনে ক্ষতি ছাড়া টিকে থাকতে দেয়

Android এ onCreate কি

onCreate হল একটি কলব্যাক পদ্ধতি যা Android Activity বা Fragment এর একটি নতুন ইনস্টেন্স তৈরি করার সময় ডাকে. এটি যূজার স্ক্রিন কোডের প্রথম প্রবেশ বিন্দু: onCreate ডাকার আগে কোন যূজার কোড চালে না। সিস্টেম পদ্ধতিটিতে একটি Bundle প্যারামিটার পাশ করে, যাতে আগে সংরক্ষিত ডাটা (পুনরায় তৈরির সময়) বা null (প্রথম লঞ্চে) থাকে।

onCreate পদ্ধতিটি ক্লাস android.app.Activity এবং ক্লাস androidx.fragment.app.Fragment এ সংজ্ঞায়িত। উভয় সংস্করণ একই রকম কাজ করে: কম্পোনেন্ট আরম্ভ, UI সেটআপ এবং অবস্থা পুনরুদ্ধার। তবে, নির্দিষ্ট বাস্তবায়ন আলাদা — Activity লেআউট লোড করতে setContentView ব্যবহার করে, যেতে Fragment onCreateView এর মাধ্যমে একটি View ফেরত দেয়। ডিভেলপারকে Activity এ অন্তত onCreate অভিরোপ করতে হবে — এটা ছাড়া, Android স্ক্রিন প্রদর্শন করতে পারবে না।

onCreate একটি Activity ইনস্টেন্সের সম্পূর্ণ জীবনচক্রে কঠোরভাবে একবার ডাকা হয়। স্ক্রিন ঘূর্ণনেও, একটি নতুন Activity ইনস্টেন্স পূর্ববর্তী ইনস্টেন্স থেকে Bundle সহ একটি নতুন onCreate কল পায়। এটি onCreate কে একবারের আরম্ভের জন্য আদর্শ স্থান করে তোলে: ডাটা লোড করা, অ্যাডাপ্টার তৈরি করা, Dagger বা Hilt এর মাধ্যমে DI কম্পোনেন্ট সেটআপ করা।

Activity এ onCreate

Activity এ, onCreate পদ্ধতিটি চারটি মূখ্য কাজ করে: লেআউট মার্কআপ লোড করা, View উপাদান আরম্ভ করা, Bundle থেকে অবস্থা পুনরুদ্ধার করা এবং প্রাথমিক ইভেন্ট হ্যান্ডলার সেটআপ করা. onCreate এ বাধ্যতামূলক সর্বনিম্ন কোড হল super.onCreate(savedInstanceState) এবং setContentView(R.layout.activity_main) ডাকা।

kotlin
class MainActivity : AppCompatActivity() {
    private var binding: ActivityMainBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // ViewBinding — findViewById এর একটি আধুনিক বিকল্প
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding?.root)

        // binding ব্যবহার করে আরম্ভ
        binding?.apply {
            welcomeText.text = getString(R.string.welcome)
            startButton.setOnClickListener { startGame() }
        }

        // অবস্থা পুনরুদ্ধার
        if (savedInstanceState != null) {
            score = savedInstanceState.getInt("score", 0)
            binding?.scoreText?.text = score.toString()
        }
    }
}

আধুনিক অভ্যাস findViewById এর পরিবর্তে ViewBinding ব্যবহার করে। ViewBinding কম্পাইল টাইমে ক্লাস ActivityMainBinding জেনারেট করে, যা ভুল ID এর ত্রুটি দূর করে এবং বয়লারপ্লেট কোড হ্রাস করে। Google Android Studio 3.6 থেকে শুরু করে Activity এবং Fragment এ View অ্যাক্সেসের মানক উপায় হিসাবে ViewBinding সুপারিশ করে।

onCreate এ কাজের ক্রম কঠোর হতে হবে: প্রথমে super, তারপর setContentView, তারপর বাকি সব। setContentView এর আগে findViewById ডাকলে null ফেরত পায় — লেআউট এখনো লোড হয়নি, এবং View উপাদান স্তরবিন্যাসে বিদ্যমান নেই। এটি শুরুর দিকের Android ডিভেলপারদের সবচেয়ে সাধারণ ভুলগুলির একটি।

Fragment এ onCreate

Fragment এ onCreate Activity থেকে আলাদা: এখানে setContentView ডাকা হয় না, শুধুমাত্র UI সম্পর্কিত নয় এমন ডাটা আরম্ভ করা হয়. Fragment কম্পোনেন্ট তৈরি এবং View তৈরি দুটি পৃথক পদ্ধতিতে বিভক্ত করে: onCreate (একবার ডাকা হয়) এবং onCreateView (যদিনি View তৈরি বা পুনরায় তৈরি হয় তদিনি ডাকা হয়)।

kotlin
class UserListFragment : Fragment() {
    private lateinit var viewModel: UserViewModel
    private var binding: FragmentUserListBinding? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // ViewModel আরম্ভ — View পুনরায় তৈরি টিকে থাকে
        viewModel = ViewModelProvider(this)[UserViewModel::class.java]

        // FragmentManager থেকে আর্গুমেন্ট
        arguments?.let {
            viewModel.loadUser(it.getString("user_id") ?: "")
        }

        // ঘূর্ণনে সংরক্ষণ
        retainInstance = true
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentUserListBinding.inflate(inflater, container, false)
        return binding!!.root
    }
}

Activity এবং Fragment onCreate এর মধ্যে মূখ্য পার্থক্য: Fragment এ onCreate এ View সম্পর্কিত কোড থাকা উচিত নয়, কারণ View ধ্বংস এবং পুনরায় তৈরি হতে পারে (উদাহরণস্বরূপ, ViewPager ট্যাব স্যাইচ করার সময়), যেতে onCreate শুধু একবার ডাকা হয়। ডাটা লোডিং, ViewModel সেটআপ এবং অ্যাডাপ্টার আরম্ভ onCreate কাজ, যেতে View বাঁধানো onViewCreated এর কাজ।

savedInstanceState এবং অবস্থা পুনরুদ্ধার

onCreate এ savedInstanceState প্যারামিটার হল Activity বা Fragment এর অস্থায়ী অবস্থা সংরক্ষণ এবং পুনরুদ্ধারের একটি প্রক্রিয়া. যখন সিস্টেম Activity ধ্বংস করে (স্ক্রিন ঘূর্ণন, স্বল্প মেমোরি), তখন এটি onSaveInstanceState() ডাকে, যেখানে ডিভেলপার Bundle এ কী-ভ্যালু এন্ট্রি রাখে। যখন একটি নতুন ইনস্টেন্স তৈরি হয়, তখন এই Bundle টি onCreate এ ফেরত পায়।

Bundle নিম্নলিখিত ডাটা ধরনগুলি সমর্থন করে: String, Integer, Boolean, Long, Float, Double, তাদের অ্যারে, পার্থক্য অনুসারে Parcelable এবং Serializable অবজেক্ট। জটিল অবজেক্টের জন্য, Parcelable ব্যবহার করা হয় — Android এর জন্য একটি আরও কার্যদক্ষ সিরিয়ালাইজেশন প্রক্রিয়া। Bundle এর আকার প্রায় 500 KB এ সীমিত — সীমা অতিক্রম করলে TransactionTooLargeException হয়।

kotlin
companion object {
    private const val KEY_USER_NAME = "user_name"
    private const val KEY_SCORE = "score"
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_game)

    if (savedInstanceState != null) {
        userName = savedInstanceState.getString(KEY_USER_NAME) ?: ""
        currentScore = savedInstanceState.getInt(KEY_SCORE)
    }
}

override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    outState.putString(KEY_USER_NAME, userName)
    outState.putInt(KEY_SCORE, currentScore)
}

এটা বোঝা গুরুত্বপূর্ণ: onSaveInstanceState ডাকা হয় না যখন যূজার স্পষ্টভাবে finish() বা পিছনের বাটনের মাধ্যমে Activity বন্ধ করে. সিস্টেম মনে করে যূজার সচেতভাবে কাজ শেষ করছে এবং অবস্থা সংরক্ষণের প্রয়োজন নেই। তাই, দীর্ঘমেয়ী ডাটা সংরক্ষণের জন্য শুধুমাত্র savedInstanceState এর উপর নির্ভর করা যায় না — Room, DataStore বা SharedPreferences ব্যবহার করুন।

onCreate এর সময় এবং সীমাবদ্ধি

onCreate প্রধান (UI) থ্রেডে চালে, এবং সিস্টেম Activity স্ক্রিনে প্রদর্শনের আগে এটি শেষ হতে অপেক্ষা করে. যদি onCreate এর জন্য 5 সেকেন্ডের বেশি সময় লাগে, তবে সিস্টেম একটি ANR (Application Not Responding) ডায়ালগ দেখায় এবং যূজারকে অ্যাপ্লিকেশন বন্ধ করার বিকল্প দেয়। নেটওয়ার্ক থেকে ডাটা লোড করা বা ডাটাবেস থেকে পড়ার মতো দীর্ঘ কাজ পশ্চাদ্ থ্রেডে সরানো উচিত।

Google Android Performance (2025) সুপারিশ অনুযায়ী, মধ্যম পরিসরের ডিভাইসে onCreate এর জন্য 1 সেকেন্ডের কম সময় নেওয়া উচিত। এটি অর্জনের জন্য: অলস আরম্ভ (Kotlin এ lazy delegate) ব্যবহার করুন, ভারী ডাটা লোডিং onResume বা করৌটিনে সরানোর জন্য বিলম্বিত করুন, কম ব্যবহৃত UI কম্পোনেন্টের জন্য ViewStub প্রয়োগ করুন, এবং Android Vitals এর মাধ্যমে স্টার্টআপ সময় প্রোফাইল করুন।

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    // অলস আরম্ভ — অবজেক্ট শুধু প্রথম প্রবেশে তৈরি হয়
    val heavyData by lazy {
        HeavyDataLoader.load()
    }

    // lifecycleScope এর মাধ্যমে পশ্চাদ্ থ্রেডে ডাটা লোড করা
    lifecycleScope.launch(Dispatchers.IO) {
        val users = userDao.getAllUsers()
        withContext(Dispatchers.Main) {
            adapter.submitList(users)
        }
    }
}

প্রোফাইলিং টুল: Android Studio Profiler (CPU ট্যাব) প্রত্যেক পদ্ধতির সঠিক সময় দেখায়। Android Vitals (Google Play Console) এ, আপনি «কোলড স্টার্ট টাইম» মেট্রিক ট্রেক করতে পারেন — আপনার Activity এর onCreate 500 ms অতিক্রম করলে, কনসোল এটিকে একটি কর্মদক্ষতা সমস্যা হিসাবে চিহ্নিত করে। IT Sectr এ, আমরা CI পাইপলাইনে প্রত্যেকটি Activity এর স্টার্টআপ সময়ের স্বচালিত নিয়ন্ত্রণের জন্য Macrobenchmark পরীক্ষা ব্যবহার করি।

ViewModel এবং onCreate

ViewModel হল onCreate এ ডাটা আরম্ভের সর্বোত্তম উপায় যা স্ক্রিন ঘূর্ণনে টিকে থাকা উচিত. ViewModel তৈরি হয় onCreate এ ViewModelProvider এর মাধ্যমে এবং কনফিগারেশন পরিবর্তনে স্বচালিতভাবে সংরক্ষিত থাকে। ঘূর্ণনের পর Activity পুনরায় তৈরি হলে, ViewModel মেমোরিতে থাকে এবং onCreate ডাটা ক্ষতি ছাড়া একই ViewModel পায়।

kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_profile)

    // ViewModel একবার তৈরি হয় এবং কনফিগারেশন পরিবর্তন টিকে থাকে
    val viewModel: ProfileViewModel =
        ViewModelProvider(this)[ProfileViewModel::class.java]

    // LiveData পর্যবেক্ষণ — ডাটা পরিবর্তনে UI স্বচালিতভাবে আপডেট হয়
    viewModel.user.observe(this) { user ->
        binding?.userName?.text = user.name
        binding?.userEmail?.text = user.email
    }

    // যদি ViewModel এমন্ড তৈরি হয় তবে ডাটা লোড করা
    if (savedInstanceState == null) {
        viewModel.loadProfile(userId)
    }
}

ViewModel + LiveData/StateFlow এর সম্মিলন Bundle এ ম্যানুয়াল সেভিং ছাড়া স্ক্রিন ঘূর্ণন সমস্যা সমাধান করে। ViewModel মেমোরিতে ডাটা সংরক্ষণ করে, LiveData পুনরায় তৈরিতে Activity কে স্বচালিতভাবে পুনরায় সাবস্ক্রাইব করে, এবং StateFlow (Kotlin Coroutines থেকে) করৌটিন সমর্থন সহ প্রতিক্রিয়াশীলতা যোগ করে। Google এর Guide to App Architecture এ সুপারিশিত মানক আর্কিটেক্চার এটি।

onCreate নিয়ে কাজ করার সময় সাধারণ ভুল

অনুভী ডিভেলপাররাও onCreate এ বৈশিষ্ট্যিক ভুল করে। আসুন পাঁচটি সবচেয়ে সাধারণ সমস্যা এবং সেগুলি এড়ানোর উপায় দেখি।

setContentView এর আগে View নিয়ে কাজ করা

সবচেয়ে সাধারণ ভুলটি হল setContentView ডাকার আগে findViewById এর মাধ্যমে একটি View খুঁজে পাওয়ার চেষ্টা করা. সব View উপাদান লেআউট ইনফ্লেশনের সময় তৈরি হয়, তাই setContentView এর আগে যে কোন findViewById কল null ফেরত দেয় এবং View ব্যবহার করার চেষ্টায় NullPointerException সৃষ্টি করে। সমাধান: কঠোর ক্রম — প্রথমে super, তারপর setContentView, তারপর findViewById বা ViewBinding।

ডির্ঘ কাজের মাধ্যমে UI থ্রেড অবরুদ্ধ করা

নেটওয়ার্ক থেকে ডাটা লোড করা, ডাটাবেস থেকে পড়া বা বড় অ্যারে সরাসরি onCreate এ প্রক্রিয়া করা প্রথম ফ্রেমের রেন্ডারিং অবরুদ্ধ করে. যূজার onCreate শেষ হতে একটি কালো স্ক্রিন দেখে, যা অ্যাপ্লিকেশনের গতি সম্পর্কে ধারণা খারাপ করে। সমাধান: অসিংক্রনাস কাজের জন্য lifecycleScope.launch ব্যবহার করুন, লোডিং শেষ হতে একটি কংকাল (UI placeholder) প্রদর্শন করুন।

savedInstanceState উপেক্ষা করা

যদি আপনি স্ক্রিন ঘূর্ণনে Bundle থেকে অবস্থা পুনরুদ্ধার না করেন, তবে যূজার সকল অসংরক্ষিত ইনপুট হারায়: ফর্ম ফিল্ডে টেক্সট, স্ক্রল অবস্থান, নির্বাচিত আইটেমগুলি। সমাধান: ডাটা পুনরুদ্ধারের জন্য সবশময় onCreate এ savedInstanceState != null পরিদ্শন করুন, যদিও অবস্থা হানির সম্ভাবনা কম মনে হয়।

বেনাম ক্লাসের মাধ্যমে মেমোরি লিক

onCreate এ বেনাম ক্লাস এবং ল্যাম্বডা ধ্বংসের পরও পরোক্ষভাবে একটি Activity এর রিফারেন্স ধরে রাখতে পারে. উদাহরণস্বরূপ, onCreate এ তৈরি একটি Handler Activity ধ্বংসের পরও বিলম্বিত কাজ চালাতে থাকে। সমাধান: LifecycleObserver, ViewModel এবং lifecycleScope ব্যবহার করুন, যা ধ্বংসে স্বচালিতভাবে কাজ বাতিল করে।

Fragment onCreate এ অতিরিক্ত আরম্ভ

Fragment onCreate এ View আরম্ভ করা একটি যুক্তিগত ভুল, কারণ View কে onCreate ডাকা ছাড়া পুনরায় তৈরি করা যায়। আপনি যদি onCreate এ একটি শ্রোতা সেট করেন কিন্তু onCreateView এ View বাঁধেন, তবে পুনরায় তৈরিতে শ্রোতাটি পুরনো View এ রয়ে যাবে। সমাধান: সকল View-সম্পর্কিত কাজ onViewCreated এ করুন, onCreate কে শুধুমাত্র ডাটা লেয়ার আরম্ভের জন্য ছাড়ুন।

সাধারণ জিজ্ঞাসা

Activity এ onCreate অভিরোপ করা কি বাধ্যতামূলক?

হ্যাঁ, onCreate অভিরোপ করা বাধ্যতামূলক যে কোনো Activity র জন্য যা যূজার ইন্টারফেস প্রদর্শন করে। এটা ছাড়া, setContentView ডাকা এবং XML লেআউট লোড করা অসম্ভব। যদি Activity এর UI না থাকে (উদাহরণস্বরূপ, একটি স্বচ্ছ Activity-স্টাব), তবেও onCreate অভিরোপ করা হয়, কিন্তু setContentView ডাকা ছাড়া।

Activity ধ্বংস না করে কি onCreate আবার ডাকা যেতে পারে?

না, একই Activity ইনস্টেন্সের জন্য onCreate আবার ডাকা যেতে পারে না. যদি Activity ধ্বংস এবং পুনরায় তৈরি হয় (স্ক্রিন ঘূর্ণন, স্বল্প মেমোরি), এটি একটি নতুন ইনস্টেন্স যার একটি নতুন onCreate কল রয়েছে। ব্যতিক্রম হল recreate() পদ্ধতি, যা Activity কে জোর করে ধ্বংস এবং পুনরায় তৈরি করে, কিন্তু এটি একটি নতুন ইনস্টেন্সের পুনরায় তৈরি।

super.onCreate ডাকা না হলে কি হয়?

আপনি যদি super.onCreate(savedInstanceState) ডাকা না হয়, তবে Android Runtime একটি SuperNotCalledException ছুড়ে দেয় এবং অ্যাপ্লিকেশন ক্র্যাশ করে। সিস্টেম কঠোরভাবে দাবি করে যে প্রত্যেকটি অভিরোপিত জীবনচক্র পদ্ধতি এর super সংস্করণ ডাকা উচিত — এটি আন্তরিক অবস্থা মশিনের সঠিক কাজ নিশ্চিত করে।

Activity এ onCreate এবং Fragment এ onCreate এর মধ্যে পার্থক্য কি?

প্রধান পার্থক্য: Activity এ onCreate setContentView এর মাধ্যমে UI লোড করে, যেতে Fragment এ onCreate শুধু ডাটা আরম্ভ করে. Fragment একটি পৃথক পদ্ধতি onCreateView এ View তৈরি করে, যা একাধিকবার ডাকা যেতে পারে (উদাহরণস্বরূপ, ট্যাব স্যাইচ করার সময়), যেতে Fragment onCreate ফ্রাগমেন্ট ইনস্টেন্সের জীবনকালে একবার ডাকা হয়।

কিভাবে onCreate থেকে অন্য পদ্ধতিতে ডাটা পাশ করবেন?

onCreate এ আরম্ভ করা ডাটা Activity বা Fragment এর ক্লাস ফিল্ডে সংরক্ষিত হয়. উদাহরণস্বরূপ, private lateinit var binding: ActivityMainBinding ক্লাস স্তরে ঘোষিত হয়, onCreate এ আরম্ভ করা হয় এবং পরবর্তী সকল পদ্ধতিতে উপলব্ধ থাকে। স্ক্রিন ঘূর্ণনে টিকে থাকা ডাটার জন্য, LiveData বা StateFlow সহ ViewModel ব্যবহার করুন।

সারাংশ

  • onCreate — একটি বাধ্যতামূলক জীবনচক্র পদ্ধতি, Activity বা Fragment তৈরির সময় একবার ডাকা হয়
  • setContentView — Activity এর জন্য একটি বাধ্যতামূলক কল, XML লেআউট লোড করে; Fragment এর জন্য, লেআউট onCreateView এর মাধ্যমে লোড করা হয়
  • savedInstanceState — পুনরায় তৈরিতে সংরক্ষিত অবস্থা সহ Bundle; প্রথম লঞ্চে null
  • সময় সীমা — onCreate এর জন্য 1 সেকেন্ডের কম সময় লাগা উচিত, দীর্ঘ কাজ করৌটিনে সরানো হয়
  • ViewModel — onCreate এ ViewModel আরম্ভ করা স্ক্রিন ঘূর্ণনে ডাটা হানির সমস্যা সমাধান করে
  • Fragment vs Activity — Fragment onCreate এ UI কোড থাকে না, Activity onCreate setContentView এর মাধ্যমে লেআউট লোড করে
  • পাঁচটি বৈশিষ্ট্যিক ভুল — setContentView এর আগে View নিয়ে কাজ করা, UI অবরুদ্ধ, Bundle উপেক্ষা, মেমোরি লিক, Fragment.onCreate এ UI কোড

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন