<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های داریوش فتحی</title>
        <link>https://virgool.io/feed/@kapta</link>
        <description>توسعه دهنده اندروید و دوست دار طبیعت</description>
        <language>fa</language>
        <pubDate>2026-06-07 12:07:39</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/28973/avatar/JWyO5P.png?height=120&amp;width=120</url>
            <title>داریوش فتحی</title>
            <link>https://virgool.io/@kapta</link>
        </image>

                    <item>
                <title>سوالاتی که در مصاحبه از توسعه دهنده اندروید پرسیده می شود. E=2</title>
                <link>https://virgool.io/@kapta/%D8%B3%D9%88%D8%A7%D9%84%D8%A7%D8%AA%DB%8C-%DA%A9%D9%87-%D8%AF%D8%B1-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%A7%D8%B2-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%D9%87-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D9%BE%D8%B1%D8%B3%DB%8C%D8%AF%D9%87-%D9%85%DB%8C-%D8%B4%D9%88%D8%AF-e1-rbek58zszwyi</link>
                <description>سلام در این مقاله سعی می کنم سولاتی که بیشتر در مصاحبه ها پرسیده شده (یا از خودم پرسیدن و خودم تجربه کردم) رو لیست کنم که قبل از مصاحبه بتونید به اون آمادگی نسبی برسید و اطلاعات کافی در موردشون داشته باشید. همچین منابعی رو برای مطالعه قرار میدم که کارتون راحت تر باشه .سعی میکنم همین مقاله رو آپدیت کنم و سوالات جدید رو اضافه کنم و اون کانتری که داخل تیتر قرار دادم رو افزایش بدم.۱. مدیریت و نشتی حافظه - Memory Management &amp; Leaks (اهمیت = اورژانسی)A memory leak happens when your code allocates memory for an object, but never deallocates it. This can happen for many reasons.No matter the cause, when a memory leak occurs the Garbage Collector thinks an object is still needed because it’s still referenced by other objects. But those references should have cleared.در کل مدیریت حافظه یکی از مهمترین سوالاتی است که در مصحابه ها پرسیده میشه . از دولوپر انتظار میره که احاطه کامل به این مبحث داشته باشه. این موارد رو هم بررسی کنید:Heap vs StackGC (garbage collector)Memory Leaks And How To Avoid ThemCommon Memory LeaksHow to find leaks in AndroidAndroid Studio memory profilerمنابع کمکیMemory Leaks in AndroidHow to create a memory leak in Java?9 ways to avoid memory leaks in AndroidEverything you need to know about Memory Leaks in AndroidAndroid Studio Profiler - official documentDetecting and fixing memory leaks in androidMemory leaks in Android — identify, treat and avoidHeap Vs Stack Heap Vs Stack 2Heap Vs Stack 3Stack vs. Heap: Understanding Java Memory AllocationStackOverFlow - Questions tagged [memory-leaks]۲. چرخه حیات کامپوننت های اندروید - Android Components Lifecycle (اهمیت = خیلی زیاد)شاید به نظر بیاد که این سوال رو میتونید خیلی راحت پاسخ بدید. ولی مصاحبه کننده میتونه سوالاتی مطرح کنه تا حالا باهاش برخورد نکردین و نمیدونین رفتار اندروید در اون مورد چیه . مثلا :اگر در  بیایم و مقدار text یک TextVi‍‍ew‍ رو آپدیت کنیم چه اتفاقی می افته؟وقتی یه دیالوگ نمایش داده میشه Lifecycle اکتویتی چه تغییراتی می کنه؟ (یا اینکه اصلا تغییر میکنه؟)فرض کنید داخل Activity یک Fragment دارید،  فرگمنت با  اکتویتی چه تفاوتی داره ؟ کدومشون اول اجرا میشن ؟تفاوت  با  چیه ؟متد onDestroy چه وقتی فراخوانی میشه ؟و ... منابع کمکیAndroid activity lifecycle - what are all these methods for?Deep understanding of Lifecycle, the cornerstone of Android architecture componentsDifference between () and ()Activity lifecycle - official documents Android Architecture Components: LifeCycleUsing Android Jetpack Lifecycle-Aware Components۳. روش ارسال داده و ارتباط بین Activity با Activity و Fragment با Activity و یا Fragment با Fragment4. تفاوت Lifecycle فرگمنت با Activity  ادامه دارد ...</description>
                <category>داریوش فتحی</category>
                <author>داریوش فتحی</author>
                <pubDate>Thu, 02 Jul 2020 11:21:52 +0430</pubDate>
            </item>
                    <item>
                <title>وابستگی های زمان اجرا :‌   Dagger 2+ Runtime dependency</title>
                <link>https://virgool.io/@kapta/%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-%D8%B2%D9%85%D8%A7%D9%86-%D8%A7%D8%AC%D8%B1%D8%A7-dagger-2-runtime-dependency-afzmnmna8a61</link>
                <description>مواقعی پیش میاد که dependency که میخوایم تزریق کنیم آماده نیست و باید صبر کنیم تا آماده بشه . dagger به صورت پیش فرض همچین امکانی نداره . مثلا :class MyViewModel @Inject constructor (privateval dependency: Dependency) {

}

class Dependency(applicationContext: Context, viewModelScope: CoroutineScope) {
 //  some logic here ...
 //  viewModelScope is a runtime dependency
}

اگر توجه کنید کلاس Dependency به viewModelScope نیاز داره و خود  ViewModel هم به کلاس Dependency وابسته س . همچنین viewModelScope تا زمانی که خود ViewModel ساخته نشه در دسترس نیست . ولی applicationContext رو از همون ابتدای شروع برنامه داریمشیر تو شیر!راه حل چیه؟در همچین مواردی میتونیم از Factory Pattern استفاده کنیم  یا اینکه از لایبرری  AssistedInject حضرت Jake Wharton استفاده کنیم که اینم باز میاد از همون Factory Pattern استفاده میکنه. توی این مقاله سعی کردم از Factory Pattern  استفاده کنم.راه حلبرای مثال بالا اینطور عمل می کنیم:interface DependencyFactory {     
     fun create(viewModelScope: CoroutineScope) : Dependency 
} 

 class DependencyFactoryImpl(privateval applicationContext: Context)
      : DependencyFactory  {       

     override fun create(viewModelScope: CoroutineScope) : Dependency  {           
           return Dependency(applicationContext, viewModelScope)     
     }  
}اگر بازم خوب توجه کنید! میبینید که viewModelScope به عنوان پارمتر متد create ارسال شده و مقدار بازگشتی این متد همون چیزیه که ما لازم داریم . پس داخل ViewModel یه همچین چیزی داریم:class MyViewModel @Inject constructor (privateval dependencyFactory: DependencyFactory ) { 

val dependency = dependencyFactory.create(viewModelScope)

 }به جای اینکه خود Dependency رو تزریق کنیم، factory یش رو تزریق کردیم . توجه کنید برای رعایت حرف D اصول SOLID یا همون Dependency Inversion به جای اینکه Implementation یعنی DependencyFactoryImpl  رو تزریق کنیم اومدیم و Abstraction یعنی همون اینترفیس DependencyFactory رو تزریق کردیم (این پاراگراف پر تزریقه !) . اینجوری به قول حرفه ای ها کدمون decouple میشه (کمتر به هم وابسته ن) برای این کار کافیه که وقتی Factory رو داخل گراف Provide میکنید اون رو به DependencyFactory کست کنیدامیدوارم به کارتون بیاد من همه چی بلد نیستم ولی همچنان در حال یادگیریم . پس اگر مشکلی داشت تو کامنت سکشن بیلو! اشاره کنیدخداقوت / دلتون خوش / غمتون کم / عشقتون زیاد</description>
                <category>داریوش فتحی</category>
                <author>داریوش فتحی</author>
                <pubDate>Wed, 01 Jul 2020 19:26:06 +0430</pubDate>
            </item>
                    <item>
                <title>وقت اینه که دست های خودمون رو با Epoxy رنگی کنیم [سری آموزش پیاده سازی لیست های با ساختار پیچیده با استفاده از کتابخانه Epoxy در Android]</title>
                <link>https://virgool.io/devAndroid/epoxy-part1-qxnxb9c0l5jf</link>
                <description>اگر با Epoxy آشنایی ندارید می تونید یه سری به صفحه گیت هاب این کتابخانه بزنید  https://github.com/airbnb/epoxy یا همین جا بمونید و ادامه بدید !توجه کنید که در این سری آموزش فرض شده است که با  RecyclerView  آشنا هستید ، در غیر این صورت می توانید از طریق آموزش های موجود در اینترنت نسبت به یادگیری این موارد اقدام کنید .What is Epoxy ?اپوکسی یک لایه  Abstraction است که بر روی کتابخانه RecyclerView بنا شده است (اینی که گفتی یعنی چه ؟!!)بزارید راحت باشیمهمیشه وقتی صحبت از لیست ها باشه ناخود آگاه به تعدادی آیتم که دقیقا شبیه هم هستند فک می کنیم . مثلا لیستی از نام ، شماره ، غذا ، ماشین و ... و برای اجرای این لیست عادی این مراحل رو طی می کنیم : (صرفا به عنوان مثال)داخل لایه activity یک RecyclerView اضافه میکنیم یک لایه برای آیتم های که قراره داخل لیست نشون داده بشن می سازیمیک Adapter از نوع  RecylerView.Adapter می سازیم یک layoutManager می سازیم که بسته به نیاز می تونیم LinearyLayoutManager باشه یا GridLayoutManager یا ...و تمام این موارد رو بهم متصل می کنیم تا لیست درست بشه یک فرایند تکراری به شدت خسته کننده با کدهایی که هر بار مجبوری تکرار کنی (البته روش هایی برای کم کردن میزان این کد ها هست ولی به این سری آموزش ربطی نداره)چیزی که شاید کمتر بهش فک کنیم اینه که اگر حتی 100,000،000 آیتم به Adapter اضافه کنیم باز هم اسکرول نرم و بدون لگی رو داریم و تعداد آیتم ها هیچ تاثیری نداره (این از برکات استفاده از RecyclerView ِ) .حالا فرض کنید که ازتون بخوان یک لیست با دو نوع لایه متفاوت بسازید . خوب خیلی راحت می تونید لایه جدید رو داخل فولدر layout تعریف کنید و متد getItemViewType اداپتر رو override  کنید و مشخص کنید که برای هر position کدام لایه استفاده بشه  و داخل onCreateViewHolder  لایه مورد نظر رو inflate کنید . به این صورت : final int VIEW_TYPE_1 = 0;
final int VIEW_TYPE_2 = 1;

@Override
  public int getItemViewType(int position) {
    if (position % 2 = 0) {
                return 1;
        } 
        return 0;
  }
  @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int                      viewType) {

// لایه نوع یک 
View itemLayoutViewType1 = LayoutInflater.from(parent.getContext()).inflate(
        R.layout.item_type_1, parent, false);

// لایه نوع دو
View itemLayoutViewType2 = LayoutInflater.from(parent.getContext()).inflate(
        R.layout.item_type_2, parent, false);

    switch (viewType) {
      case VIEW_TYPE_1 :
        ViewType1Holder type1Holder = new ViewType1Holder        (itemLayoutViewType1);
        return type1Holder ;
      default :
        ViewType2Holder type2Holder = new ViewType2Holder        (itemLayoutViewType2);
        return type2Holder ;
    }
    
    
class ViewType1Holder extends RecyclerView.ViewHolder {
        ...
}
class ViewType2Holder extends RecyclerView.ViewHolder {
         ...
 }کار به اینجا ختم نمیشه و باید داخل onBindViewHolder  هم منطقی مناسب رو اضافه کنید :@Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {

    if (holder instanceof ViewType1Holder ) {
      ...
    }

     if (holder instanceof ViewType2Holder ) {
      ...
    }
  }حالا اگر درخواست دیگری مبنی بر اضافه کردن نوع سومی از لایه بشه چی ؟ به زودی می بینید که با اضافه کردن viewType های بیشتر به لیست ، حجم Adapter زیاد میشه و خوانایی کدها و کمتر میشه و نتیجتا نگهداریش سخت میشه . دقت کنید که ممکنه لایه نوع n ام  خودش یک لیست باشه (nested lists) و برای این مورد نیاز است کد و اقدامات بیشتری انجام داده بشه . استفاده از nested لیست ها در طراحی برنامه اندرویدی خیلی مرسوم هستند . مثلا اکثر برنامه فروشگاهی مانند google play و دیجی کالا یا موارد دیگر از این ساختار استفاده می کنند . لیست های تو در تو (nested list) :تصویر بالا رو ببینید ، لیست اصلی یک لیست عمودی است و آیتم های موجود در این لیست خودشان لیست های افقی هستند . درست کردن یک همچین لیستی کار تقریبا ساده ای است . کافیه دو  Adapter جداگانه تعریف کنیم که یکی از آنها لیست مادر را اداپت کند و اون یکی هم لیست ها فرزند رو . داخل onBindViewHolder لیست مادر باید یک همچین منطقی اضافه کنیم : childRecyclerView.setHasFixedSize(true);       
childRecyclerView.setLayoutManager(new ChildLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));        
childRecyclerView.setAdapter(adapter);        childRecyclerView.setRecycledViewPool(viewPool); تعیین کردیم که سایز تمام آیتم ها یکسانه (setHasFixedSize) . اینطوری لیست مادر دیگه لیست لازم نیست با اضافه کردن آیتم جدید به محاسبات بپردازه  کافیه از اندازه های موجود استفاده کنه  و تمام لیست های فرزند به یک viewPool یکسان متصل هستند اینطوری آیتم های موجود در داخل لیست های فرزند بین اونها به اشتراک گذاشته می شه (recycle میشه). در نگاه اول هیچ مشکلی خاصی با پیاده سازی لیست های تو در تو نداریم . ولی مشکلات به زودی نمایان می شوند .گفتیم که viewPool آیتم های موجود در لیست های فرزند رو recycle میکنه و دوباره استفاده میکنه . یعنی ممکنه آیتمی که الان داخل لیست  n ام داریم می بینیم قبلا داخل لیست m ام بوده باشه . توجه کنید که viewPool وقتی کاربرد داره که آیتم ها یکسان باشند درست مث google play که 90 درصد یا بیشتر آیتم های موجود در لیست های افقی یکسان هستند . وجود آیتم های یکسان باعث میشه که اسکرول نرم و بدون لگی داشته باشیم . اما با در نظر گرفتن لایه های متفاوت برای هر کدام از لیست های افقی دیگه این اسکرول رو نرم رو نخواهیم داشت و با لگ های طولانی مواجه می شیم . علتش اینکه هیچ view ای بازیافت نمیشه و لیست ها افقی مجبورا هر بار آیتم هاشون رو inflate کنند  که زمان بره . مشکل بعدی اینه که state لیست های افقی ذخیره نمیشه و scroll position خودشون رو زمانی که از لیست اصلی detach بشن از دست میدن .البته برای این مورد میتونیم منطقی بنویسیم که state ها رو ذخیره کنه و بعدا اینا رو برگردونیم .لیست با چند view typeخوب اینجاست که Epoxy خود نمایی میکنه برای ساخت لیست هایی با آیتم های با ساختار پیچیده و همزمان تعداد viewType های متفاوت (در حد اینکه هیچ آیتم یکسانی نداشته باشیم !) از Epoxy  استفاده می کنیم . ادامه دارد ...</description>
                <category>داریوش فتحی</category>
                <author>داریوش فتحی</author>
                <pubDate>Sat, 01 Jun 2019 22:48:36 +0430</pubDate>
            </item>
                    <item>
                <title>چند extension کاربردی برای صرفه جویی در زمان برنامه نویسان Android - قسمت سوم (ادامه دارد..)</title>
                <link>https://virgool.io/@kapta/%DA%86%D9%86%D8%AF-extension-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B5%D8%B1%D9%81%D9%87-%D8%AC%D9%88%DB%8C%DB%8C-%D8%AF%D8%B1-%D8%B2%D9%85%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D8%A7%D9%86-android-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-%D8%AF%D8%A7%D8%B1%D8%AF-mlnx9zwoztew</link>
                <description>  این سومین قسمت از &quot;چند extension کاربردی برای صرفه جویی در زمان .... &quot;  است . لینک دو قسمت قبلی را می توانید در زیر مشاهده کنید  :قسمت دوم - دومین قسمت رو به Toast هاقسمت اول - اولین قسمت رو به Intent ها اختصاص دادیمدر قسمت اول این سری اشاره کردیم که extension ها رو کجا و چطوری ذخیره و مدیریت کنید بهتره . خالی از لطف نیست اگر نیم نگاهی به قسمت اول بندازید . بدون مقدمه میرم سر اصل مطلب !تا بحال از clipboard  استفاده کردید ؟ توی یه جمله بگم clipboard یه متن رو کپی میکنه که بعدا میتونیم paste کنیم  راه حل extension ی  :fun Context.copyToClipboard(text: CharSequence) {
    val clipboard = this.getSystemService(Context.CLIPBOARD_SERVICE) as 
    ClipboardManager
    val clip = ClipData.newPlainText(&quot;label&quot;, text)
    clipboard.primaryClip = clip
}برای کپی کردن یه رشته داخل clipboard کافیه copyToClipBoard را فراخوانی کنید و رشته مورد نظر رو به عنوان پارامتر بهش پاس بدید . مث قطعه کد زیر :copyToClipboard(&quot;abcdefghijklmnopqrstuvwyz&quot; as CharSequence)
// or
val myString = &quot;abcdefghijklmnopqrstuvwyz&quot;
copyToClipboard(myString as CharSequence)یه نکته مهم به تعریف تابع ()Context.copyToClipboard توجه کنید .به  Context ای که به اول متد اضافه شده receiver میگیم . به چه معنیه ؟این receiver مشخص میکنه که چه کلاس ها یا نمونه هایی از یک کلاس میتونن این متد رو فراخوانی کنن . دلیل این که محدود کردیم چه کلاس هایی از این متد استفاده کنن اینه که به خود اون کلاس نیاز داریم !مثلا برای متدی که در بالا تعریف شده receiver ما باید از نوع Context باشه . یعنی فقط کلاس ها یا نمونه هایی از کلاس هایی که از جنس Context هستند یا از Context مشتق گرفته شده اند (Activity  , Service Application  و ....) می توانند  copyToClipBoard را فراخوانی کنند . کلمه this داخل متد copyToClipBoard به receiver اشاره میکنه حالا اگر کلاسمون از جنس Context نبود چی ؟اگر کلاس میزبان از جنس Context نبود باید حداقل یه نمونه از Context داشته باشیم و به این صورت copyToClipBoard رو فراخوانی می کنیم :context.copyToClipboard(&quot;abcdefghijklmnopqrstuvwyz&quot; as CharSequence)البته این روش زیاد جالب نیست (به نظر من)پس بیایید تابع copyToClipBoard رو یه مقدار تغییر بدیم . مثلا اینطوری : fun String.copyToClipboard(context : Context) {   
     val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as      
     ClipboardManager     
     val clip = ClipData.newPlainText(&quot;label&quot;, this as CharSequence)     
     clipboard.primaryClip = clip 
} خوب  receiver مون در تابع جدید از نوع String ه . یعنی هر رشته ایی از نوع String میتونه copyToClipboard رو فرخوانی کنه . ولی در نهایت باز هم نیاز به Context که به صورت پارامتر باید پاس داده بشه (در نسخه قبلی Context خود  receiver بود) . به نمونه کد زیر توجه کنید :&quot;abcdefghijklmnopqrstuvwyz&quot;.copyToClipboard(this /* context instance */)
 // or 
 val myString = &quot;abcdefghijklmnopqrstuvwyz&quot;&quot;
 myString.copyToClipboard(this /* context instance */)
 اگر متوجه نشدید که receiver واقعا چیه تابع جدید رو با نسخه قدیمی مقایسه کنید .  این پست همچنان ادامه دارد ....روز/شب خوبی داشته باشید </description>
                <category>داریوش فتحی</category>
                <author>داریوش فتحی</author>
                <pubDate>Thu, 24 Jan 2019 00:32:18 +0330</pubDate>
            </item>
                    <item>
                <title>چند extension کاربردی برای صرفه جویی در زمان برنامه نویسان Android - قسمت دوم (ادامه دارد..)</title>
                <link>https://virgool.io/@kapta/%DA%86%D9%86%D8%AF-extension-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B5%D8%B1%D9%81%D9%87-%D8%AC%D9%88%DB%8C%DB%8C-%D8%AF%D8%B1-%D8%B2%D9%85%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D8%A7%D9%86-android-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-%D8%A7%D8%AF%D8%A7%D9%85%D9%87-%D8%AF%D8%A7%D8%B1%D8%AF-tskxngp2ryyd</link>
                <description>برای نشان دادن Toast به صورت پیشفرض از همچین کدی استفاده می کنیم : Toast.makeText(this, message, Toast.LENGTH_SHORT).show()شاید کد زیادی نباشه و نوشتنش خیلی زمان نبره . اما اگر پروژه به اندازه کافی بزرگ بشه و تعداد Toast هایی که قرار نشان داده بشوند سر به فلک بکشه متوجه می شوید که یه خط کدم یه خط کده !راه حل extension ی (تلفظ کنید اکستنشنی) :fun AppCompatActivity.shortToast(message: String) {
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show() 
}
fun AppCompatActivity.longToast(message: String) {
            Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}حالا داخل activity ها کافیه shortToast یا longToast رو فراخوانی کنید و پیامی که می خوایید نشان داده بشه رو به عنوان پارامتر ارسال کنید . مث تکه کد زیر :shortToast(&quot;this is your message&quot;)
// or
longToast(&quot;this is your message&quot;)لینک قسمت اول آموزش </description>
                <category>داریوش فتحی</category>
                <author>داریوش فتحی</author>
                <pubDate>Wed, 23 Jan 2019 09:08:57 +0330</pubDate>
            </item>
                    <item>
                <title>چند  extension کاربردی برای صرفه جویی در زمان برنامه نویسان Android (ادامه دارد..)</title>
                <link>https://virgool.io/@kapta/%DA%86%D9%86%D8%AF-extension-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B5%D8%B1%D9%81%D9%87-%D8%AC%D9%88%DB%8C%DB%8C-%D8%AF%D8%B1-%D8%B2%D9%85%D8%A7%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D8%A7%D9%86-android-wazjvekqibu6</link>
                <description>خیلی وقتا برای استارت کردن یک activity باید باید یک نمونه از Intent بسازید و به متد startActivity پاس بدید که راحته و مث آب خوردن انجام میشه ! ولی روش خیلی بهترش که فقط با یه کد خط اجرا میشه اینه :یه کلاس از نوع کاتلین بسازید و اون رو داخل یه package به اسم extension بزارید (ساخت package الزامی نیست . فقط برای تمیز بودن محیط کار اینو گفتم . البته ممکنه بعدا extension های دیگه ای اضافه کردید  پس بهتره اضافه کنید , وقت زیادی نمیگیره نمیدونم چرا انقد لجبازی میکنید !). بعد داخل این کلاس خالی کدهای زیر رو paste کنید . دقت کنید که نیازی به تعریف بدنه کلاس نیست . این کار باعث میشه متدهایی که داخل این فایل تعریف میشن به صورت همگانی داخل تمام کلاس های دیگه در دسترس باشند (البته با توجه به receiver های هر متد)fun &lt;T : Class&lt;out AppCompatActivity&gt;&gt; AppCompatActivity.intentTo(dest: T) {
        this.startActivity(Intent(this, dest))
}
fun &lt;T : Class&lt;out AppCompatActivity&gt;&gt; AppCompatActivity.intentToAndFinish(dest: T) {
        this.startActivity(Intent(this, dest))
        this.finish()
}فقط کافیه داخل activity متد intentTo رو فراخوانی کنید و activity مقصد رو به عنوان پارامتر ارسال کنید . اگر میخواهید که بعد از ارسال اینتنت activity فعلی رو هم بزنید نابود کنید!! (finish کنید)  intentToAndFinish رو فراخوانی کنید نتیجه اینطوری میشه :intentToAndFinish(SecondActivity::class.java)
// or
intentTo(SecondActivity::class.java)این پست همچنان ادامه دارد ....روز/شب خوبی داشته باشید </description>
                <category>داریوش فتحی</category>
                <author>داریوش فتحی</author>
                <pubDate>Tue, 22 Jan 2019 21:41:17 +0330</pubDate>
            </item>
            </channel>
</rss>