انتقال داده بین فعالیت و خدمات ارتباط بین فعالیت و خدمات

برنامه همیشه از یک صفحه تشکیل نمی شود. به عنوان مثال، ما یک بسیار ایجاد کرده ایم برنامه مفیدو کاربر می خواهد بداند نویسنده کیست. او روی دکمه "درباره" کلیک می کند و به صفحه جدیدی می رسد که در آن اطلاعات مفیدی در مورد نسخه برنامه، نویسنده، آدرس سایت، تعداد گربه های نویسنده و غیره وجود دارد. یک صفحه فعالیت را به عنوان یک صفحه وب با پیوند به صفحه دیگر در نظر بگیرید. اگر به کد داخل فایل نگاه کنید MainActivity.javaاز درس های قبلی، خواهید دید که کلاس ما فعالیت اصلینیز اعمال می شود فعالیت(یا ورثه او) یا به عبارت دقیق تر از او به ارث رسیده است.

کلاس عمومی MainActivity AppCompatActivity را گسترش می دهد

همانطور که ممکن است حدس بزنید، ما باید یک کلاس جدید ایجاد کنیم که ممکن است شبیه به آن باشد فعالیت اصلیو سپس با کلیک روی دکمه به نحوی به آن تغییر دهید.

برای آزمایش، برنامه را از درس اول می گیریم و از دکمه آزمایش ها (یا ایجاد پروژه جدیدبا یک دکمه روی صفحه). بعد، بیایید ایجاد کنیم فرم جدیدبرای نمایش اطلاعات مفید. به عنوان مثال، اجازه دهید به کاربر نشان دهیم که گربه وقتی به چپ و راست می رود چه می کند. موافقم، خیلی است اطلاعات مهم، که کلید کشف جهان را می دهد.

ما یک اکتیویتی جدید را به صورت دستی ایجاد خواهیم کرد، اگرچه استودیو دارای قالب های آماده است. اما هیچ چیز پیچیده ای وجود ندارد و برای درک بهتر انجام همه کارها با دست مفید است.

بیایید یک فایل نشانه گذاری XML جدید ایجاد کنیم activity_about.xmlدر پوشه res/layout. روی پوشه کلیک راست کنید چیدمانو انتخاب کنید منوی زمینه جدید | فایل منبع چیدمان. یک جعبه گفتگو ظاهر خواهد شد. در فیلد اول نام فایل را وارد کنید فعالیت_درباره. در مرحله دوم، باید عنصر ریشه را وارد کنید. به طور پیش فرض وجود دارد ConstraintLayout. متن را پاک کنید و وارد کنید اسکرول نمای. وارد کردن چند کاراکتر کافی است تا استودیو گزینه های آماده را پیشنهاد دهد، می توانید بلافاصله Enter را فشار دهید بدون اینکه منتظر ورودی کامل کلمه باشید:

جای خالی مربوطه را می گیریم که عنصر را در آن وارد می کنیم نمای متنی.

اطلاعات از منابع، یعنی از یک منبع رشته ای بازیابی خواهد شد about_text. اکنون با رنگ قرمز مشخص شده است که نشان دهنده عدم وجود اطلاعات است. می توان فشار داد Alt+Enterو متن را در کادر محاوره ای وارد کنید. اما برای مثال ما، این روش کار نخواهد کرد، زیرا متن ما با استفاده از کاراکترهای کنترلی چند خطی خواهد بود. پس بیایید آن را متفاوت انجام دهیم. بیایید فایل را باز کنیم res/values/strings.xmlو متن زیر را به صورت دستی وارد کنید:

بلوط سبز نزدیک ساحل؛\n زنجیر طلایی بر آن بلوط:\n روز و شب گربه دانشمند\n همه چیز دور زنجیر می چرخد؛\n می رود درست- آهنگ روشن می شود،\n ترک کرد- یک افسانه می گوید.

ما از ساده‌ترین تگ‌های قالب‌بندی متن HTML مانند استفاده کردیم , , . برای مثال ما کافی است کلماتی را که به گربه و جهت حرکت اشاره می کنند پررنگ کنیم. برای ترجمه متن به خط جدیداز نمادها استفاده کنید \n. بیایید یک منبع رشته ای دیگر برای عنوان صفحه جدید اضافه کنیم:

در مورد برنامه

با نشانه گذاری قابل درک است. بعد، باید یک کلاس برای پنجره ایجاد کنید AboutActivity.java. از منو انتخاب کنید فایل | جدید | کلاس جاواو فیلدهای مورد نیاز را پر کنید. در ابتدا کافی است فقط نام را مشخص کنید. سپس به حوزه های دیگر بپردازید.

بیایید آماده سازی را انجام دهیم.

اکنون کلاس تقریباً خالی است. بیایید کد را به صورت دستی اضافه کنیم. کلاس باید از کلاس انتزاعی ارث ببرد فعالیتیا بستگانش FragmentActivity, AppCompatActivityو غیره. اضافه كردن فعالیت را گسترش می دهد. کلاس اکتیویتی باید متد داشته باشد onCreate(). نشانگر ماوس را داخل کلاس قرار داده و از منو انتخاب کنید کد | روشهای لغو(Ctrl+O). در کادر محاوره ای ما به دنبال کلاس مورد نظر هستیم که می توانید اولین کاراکترهای صفحه کلید را برای آن تایپ کنید جستجوی سریع. در متد ایجاد شده، باید متد را فراخوانی کنید setContentView()، که نشانه گذاری آماده شده را روی صفحه بارگذاری می کند. ما چنین گزینه ای خواهیم داشت.

Package en.alexanderklimov.helloworld; وارد کردن android.app.Activity; وارد کردن android.os.Bundle; /** * ایجاد شده توسط Alexander Klimov در 12/01/2014. */ کلاس عمومی AboutActivity فعالیت را گسترش می‌دهد ( @Override محافظت شده است void onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState); setContentView(R.layout.activity_about)؛ ))

اکنون مهمترین چیز شروع می شود. وظیفه ما این است که با کلیک روی یک دکمه در صفحه اول، به صفحه جدیدی برویم. برگردیم سر کلاس فعالیت اصلی. اجازه دهید کنترل کننده کلیک دکمه را بنویسیم:

Public void onClick(View view) ( Intent intent = New Intent (MainActivity.this, AboutActivity.class)؛ startActivity(intent)؛ )

در اینجا از روش مدیریت کلیک روی دکمه توضیح داده شده در درس استفاده کردم.

برای شروع یک صفحه جدید، باید یک نمونه از کلاس ایجاد کنید قصدو کلاس فعلی را در پارامتر اول و کلاس انتقال را در پارامتر دوم مشخص کنید، این را داریم درباره فعالیت. پس از آن متد فراخوانی می شود startActivity()، که صفحه جدیدی را راه اندازی می کند.

اگر اکنون سعی کنید برنامه را در شبیه ساز تست کنید، یک پیام خطا دریافت خواهید کرد. چه اشتباهی کردیم؟ ما یک قدم مهم را از دست دادیم. شما نیاز به ثبت نام جدید دارید فعالیتدر مانیفست AndroidManifest.xml. این فایل را در پروژه خود پیدا کنید و روی آن دوبار کلیک کنید. پنجره ویرایش فایل باز می شود. یک برچسب جدید اضافه کنید بعد از تگ بسته شدن برای اولین فعالیت خودتان تایپ کنید و به طور فعال از نکات استفاده کنید. موارد زیر را دریافت خواهید کرد:

اینجاست که منبع رشته به کار می آید about_title. برنامه را اجرا کنید، روی دکمه کلیک کنید و پنجره را دریافت کنید در مورد برنامه. بنابراین، ما یاد گرفتیم که چگونه یک پنجره جدید ایجاد کنیم و آن را با کلیک روی دکمه فراخوانی کنیم. و یک برنامه فوق العاده راحت در اختیار ما قرار گرفته است - اکنون همیشه اشاره ای وجود دارد که گربه هنگام رفتن به سمت چپ چه می کند.

یک بار دیگر توجه شما را به این نکته جلب می کنم که دومین کلاس اکتیویتی ایجاد شده باید از کلاس به ارث برده شود فعالیتیا مشابه ( ListActivityو غیره)، یک فایل نشانه گذاری XML (در صورت نیاز) داشته باشید و در مانیفست نوشته شود.

پس از فراخوانی روش startActivity()یک فعالیت جدید شروع خواهد شد (در این مورد درباره فعالیت، قابل مشاهده می شود و به بالای پشته حاوی اجزای در حال اجرا منتقل می شود. هنگام فراخوانی یک روش پایان ()از اکتیویتی جدید (یا زمانی که کلید backspace سخت افزاری فشار داده می شود) بسته می شود و از پشته حذف می شود. توسعه دهنده همچنین می تواند با استفاده از همین روش به فعالیت قبلی (یا هر فعالیت دیگری) پیمایش کند startActivity().

ایجاد صفحه سوم - راهی برای تنبل ها

برنامه نویسان نیز مانند گربه ها موجوداتی تنبل هستند. همیشه به یاد داشته باشید که برای فعالیت باید نشانه گذاری و کلاسی که از آن ارث می برد ایجاد کنید فعالیت، و سپس فراموش نکنید که کلاس را در مانیفست ثبت کنید - اوه خوب، چه جهنمی.

در این حالت از منو انتخاب کنید فایل | جدید | فعالیت | فعالیت اساسی(یا الگوی دیگر). در مرحله بعد، پنجره آشنا برای ایجاد یک فعالیت جدید ظاهر می شود. فیلدهای مورد نیاز را پر کنید.

روی دکمه کلیک کنید پایانو فعالیت آماده خواهد شد. برای تأیید این موضوع، فایل مانیفست را باز کنید و ورودی جدید را بررسی کنید. من در مورد فایل های کلاس و نشانه گذاری صحبت نمی کنم، آنها در مقابل شما ظاهر می شوند.

خودتان یک دکمه جدید روی صفحه اکتیویتی اصلی اضافه کنید و کد آن را بنویسید تا به فعالیت ایجاد شده بروید.

در ابتدا، من به شما توصیه می کنم که به صورت دستی تمام اجزای لازم برای یک فعالیت جدید را ایجاد کنید تا رابطه بین کلاس، نشانه گذاری و مانیفست را درک کنید. و هنگامی که به دستتان رسید، می توانید از جادوگر ایجاد فعالیت برای سرعت بخشیدن به کارها استفاده کنید.

انتقال داده ها بین فعالیت ها

ما از ساده ترین مثال برای فراخوانی یک صفحه فعالیت دیگر استفاده کردیم. گاهی اوقات لازم است نه تنها یک صفحه نمایش جدید را فراخوانی کنید، بلکه داده ها را به آن منتقل کنید. مثلا نام کاربری. در این مورد، شما باید از یک منطقه خاص استفاده کنید اطلاعات اضافی، که کلاس دارد قصد.

منطقه اطلاعات اضافییک لیست از جفت است ارزش کلیدی، که همراه با قصد منتقل می شود. رشته ها به عنوان کلید استفاده می شوند و برای مقادیر می توانید از انواع داده های اولیه، آرایه های اولیه، اشیاء کلاس استفاده کنید. دستهو غیره.

برای ارسال داده به یک فعالیت دیگر، از روش استفاده کنید putExtra():

Intent.putExtra("Key"، "Value");

فعالیت دریافت کننده باید روش مناسبی را فراخوانی کند: getIntExtra(), getStringExtra()و غیره.:

Int count = getIntent().getIntExtra("name", 0);

بیایید مثال قبلی را دوباره بسازیم. ما در حال حاضر سه فعالیت داریم. اولین فعالیت دارای دو فیلد متنی و یک دکمه خواهد بود. ظاهر ممکن است به شرح زیر باشد:

در فعالیت دوم SecondActivityعنصر را تنظیم کنید نمای متنی، که در آن متن دریافتی از اولین اکتیویتی را نمایش خواهیم داد. بیایید کد زیر را برای متد بنویسیم onCreate()در فعالیت دوم

@Override void protected onCreate(Bundle savedInstanceState) ( super.onCreate(savedInstanceState)؛ setContentView(R.layout.activity_second)؛ String user = "Animal"؛ String gift = "donut hole"؛ TextView infoTextView=dT .id.textViewInfo)؛ infoTextView.setText(user + "، به شما " + هدیه داده شد)؛ )

اگر اکنون برنامه را اجرا کنیم و به سادگی پنجره دوم را فراخوانی کنیم، همانطور که در قسمت اول مقاله توضیح داده شد، کتیبه پیش فرض را خواهیم دید. ZhYvotnoe، به شما یک سوراخ دونات داده شد. موافقم، دریافت چنین پیام هایی مایه شرمساری است.

ما وضعیت را درست می کنیم. اضافه کردن کد به فعالیت اول:

خالی عمومی onClick(نمایش) ( EditText userEditText = (EditText) findViewById(R.id.editTextUser)؛ EditText giftEditText = (EditText) findViewById(R.id.editTextGift)؛ Intent intent = SecondActivity. class)؛ // متن را از اولین فیلد متنی به کلید نام کاربری فشار دهید intent.putExtra("username", userEditText.getText().toString())؛ // متن را از قسمت متن دوم به کلید هدیه فشار دهید. intent.putExtra("gift", giftEditText.getText().toString()); startActivity(intent); )

ما در ظرف مخصوص شی قرار دادیم قصددو کلید با مقادیر گرفته شده از فیلدهای متنی. هنگامی که کاربر داده ها را در فیلدهای متنی وارد می کند، در این ظرف قرار می گیرد و به اکتیویتی دوم منتقل می شود.

فعالیت دوم باید برای دریافت گرم پیام ها به شرح زیر آماده باشد (با پررنگ برجسته شده است).

// مقادیر پیش‌فرض String user = "LIFE"; هدیه رشته = "سوراخ دونات"; user = getIntent().getExtras().getString("username"); gift = getIntent().getExtras().getString("gift"); TextView infoTextView = (TextView)findViewById(R.id.textViewInfo); infoTextView.setText(user + " , به شما داده شد " + هدیه);

اکنون این پیام چندان توهین آمیز به نظر نمی رسد، اما برای برخی حتی خوشایند است. در مثال های پیچیده، افزودن اعتبارسنجی در طول پردازش داده ها مطلوب است. موقعیت هایی وجود دارد که شما یک فعالیت دوم را با داده های خالی مانند شروع می کنید خالی، که می تواند برنامه را خراب کند.

در مورد ما، می دانیم که منتظر یک مقدار رشته هستیم، بنابراین کد را می توان به صورت زیر بازنویسی کرد:

intent intent = getIntent(); user = intent.getStringExtra("username");

User = getIntent().getStringExtra("username");

این برنامه یک اشکال دارد - مشخص نیست که از چه کسی احوالپرسی دریافت می کنیم. هر میمون خوش اخلاق هدیه ای از منبع ناشناس را نمی پذیرد. بنابراین برای تکالیف، یک فیلد متنی دیگر اضافه کنید تا نام کاربری که پیام را ارسال می کند وارد کنید.

گوگل استفاده از فرمت زیر را برای کلیدها توصیه می کند: نام بسته شما به عنوان پیشوند و به دنبال آن خود کلید. در این صورت، می توانید مطمئن باشید که کلید در تعامل با سایر برنامه ها منحصر به فرد است. تقریباً به این صورت:

عمومی نهایی استاتیک String USER = "ru.alexanderklimov.myapp.USER";

چه کسی گربه واسکا را قاب کرد - نتیجه را پس می گیریم

همیشه انتقال داده ها به یک فعالیت دیگر کافی نیست. گاهی اوقات شما نیاز دارید که اطلاعاتی را از یک فعالیت دیگر پس از بسته شدن دریافت کنید. اگر قبلا از روش استفاده می کردیم startActivity (نیت قصد)، سپس یک روش مرتبط وجود دارد startActivityForResult (هدف، int RequestCode). تفاوت بین روش ها در پارامتر اضافی نهفته است کد درخواست. این اساسا فقط یک عدد صحیح است که می توانید در مورد خودتان فکر کنید. برای تشخیص اینکه نتیجه از چه کسی به دست آمده است ضروری است. فرض کنید پنج صفحه اضافی دارید و مقادیری از 1 تا 5 را به آنها اختصاص می دهید و از این کد می توانید تعیین کنید که نتیجه چه کسی را باید پردازش کنید. می توانید از مقدار -1 استفاده کنید، سپس معادل فراخوانی متد خواهد بود startActivity()، یعنی هیچ نتیجه ای نخواهیم گرفت

اگر از روش استفاده می کنید startActivityForResult()، سپس برای دریافت نتیجه باید روش موجود در کد را لغو کنید onActivityResult()و نتیجه را پردازش کنید. سردرگم؟ بیایید نگاهی به یک مثال بیندازیم.

فرض کنید شما یک کارآگاه هستید. اطلاعاتی مبنی بر سرقت دو قطعه سوسیس و کالباس از میز یکی از افراد ذی نفوذ رستوران به دست آمد. سوء ظن به سه مظنون افتاد - یک کلاغ، یک سگ لعنتی و یک گربه واسکا.

یکی از بازدیدکنندگان مجموعه‌ای از عکس‌ها از آیفون پانتونی خود ارائه کرد:


شهادت یکی دیگر از شاهدان نیز وجود دارد: و واسکا گوش می دهد و می خورد.

ما یک پروژه جدید ایجاد می کنیم شرلوکبا دو فعالیت در صفحه اول یک دکمه برای تغییر به صفحه دوم و یک برچسب متنی وجود دارد که نام دزد را نشان می دهد.