এই পৃষ্ঠা থেকে আপনি জানতে পারবেন যে কীভাবে আপনার এনভায়রনমেন্ট সেট-আপ করবেন এবং আপনার অ্যাপে Slices তৈরি করবেন।
মনে রাখবেন: Android Studio 3.2 বা তার পরবর্তী ভার্সনে অতিরিক্ত টুল ও কার্যকারিতা রয়েছে যা আপনাকে Slice ডেভেলপ করতে সাহায্য করতে পারে:
- AndroidX রিফ্যাক্টরিং টুল: আপনি যদি এমন কোনও প্রোজেক্টে কাজ করেন যা AndroidX লাইব্রেরি ব্যবহার করে, তাহলে এটি প্রয়োজন।
- Slices লিন্ট চেক: Slices তৈরি করার সময় সাধারণ অ্যান্টি-প্র্যাক্টিস ধরে ফেলে
SliceProviderটেমপ্লেট:SliceProviderতৈরি করার সময় বয়লারপ্লেট ম্যানেজ করে
Slice Viewer ডাউনলোড ও ইনস্টল করুন
লেটেস্ট স্যাম্পেল
Slice Viewer APK রিলিজ
ডাউনলোড করুন যা আপনি SliceView API প্রয়োগ না করেই
আপনার Slice পরীক্ষা করার জন্য ব্যবহার করতে পারবেন।
আপনার এনভায়রনমেন্টে ADB সঠিকভাবে সেট-আপ করা না থাকলে, আরও তথ্যের জন্য ADB গাইড দেখুন।
ডাউনলোড করা slice-viewer.apk-এর মতো একই ডিরেক্টরিতে নিম্নলিখিত কমান্ড রান করে আপনার ডিভাইসে Slice Viewer ইনস্টল করুন:
adb install -r -t slice-viewer.apk
Slice Viewer রান করুন
আপনি Android Studio প্রোজেক্ট বা কমান্ড লাইন থেকে Slice Viewer লঞ্চ করতে পারবেন:
আপনার Android Studio প্রোজেক্ট থেকে Slice Viewer লঞ্চ করুন
- আপনার প্রোজেক্টে, রান করুন > কনফিগারেশন এডিট করুন... বিকল্প বেছে নিন
- উপরে বাঁদিকের কোণে, সবুজ রঙের যোগ চিহ্নে ক্লিক করুন
Android অ্যাপ বেছে নিন

নাম ফিল্ডে slice লিখুন
মডিউল ড্রপডাউন থেকে আপনার অ্যাপ মডিউল বেছে নিন
লঞ্চ করার বিকল্প-এর মধ্যে, লঞ্চ করুন ড্রপডাউন থেকে URL বেছে নিন
URL ফিল্ডে
slice-<your slice URI>লিখুনউদাহরণ:
slice-content://com.example.your.sliceuri
ঠিক আছে বিকল্পে ক্লিক করুন
ADB (কমান্ড লাইন)-এর মাধ্যমে Slice Viewer টুল চালু করুন
Android Studio থেকে আপনার অ্যাপ রান করুন:
adb install -t -r <yourapp>.apk
নিম্নলিখিত কমান্ড রান করে আপনার Slice দেখুন:
adb shell am start -a android.intent.action.VIEW -d slice-<your slice URI>

স্লাইস ভিউয়ার একটি ওয়াই-ফাই স্লাইস দেখাচ্ছে
আপনার সব Slice এক জায়গায় দেখুন
একটি Slice লঞ্চ করার পাশাপাশি, আপনি আপনার Slice-এর একটি স্থায়ী তালিকা দেখতে পারেন।
- URI (যেমন,
content://com.example.android.app/hello) ব্যবহার করে আপনার Slice ম্যানুয়ালি সার্চ করতে সার্চ বার ব্যবহার করুন। আপনি যতবার সার্চ করবেন, Slice তালিকায় যোগ করা হবে। - আপনি যখনই Slice URI সহ Slice Viewer টুল লঞ্চ করবেন, তখনই Slice-টি তালিকায় যোগ করা হবে।
- আপনি তালিকা থেকে কোনও Slice সরাতে সেটির উপর সোয়াইপ করতে পারেন।
- শুধুমাত্র সেই Slice-এর পৃষ্ঠা দেখতে Slice-এর URI-তে ট্যাপ করুন। এটি Slice URI সহ Slice Viewer লঞ্চ করার মতোই কাজ করে।

স্লাইস ভিউয়ার স্লাইসের তালিকা দেখাচ্ছে
বিভিন্ন মোডে Slice দেখুন
Slice দেখায় এমন অ্যাপ রানটাইমে
SliceView#mode
পরিবর্তন করতে পারে, তাই প্রতিটি মোডে আপনার Slice প্রত্যাশা অনুযায়ী দেখাচ্ছে কিনা তা নিশ্চিত করুন।
মোড পরিবর্তন করতে পৃষ্ঠার উপরে ডানদিকের অংশে মেনু আইকন বেছে নিন।

"ছোট" মোডে সেট করা সিঙ্গেল স্লাইস ভিউয়ার
আপনার প্রথম Slice তৈরি করুন
Slice তৈরি করতে, আপনার Android Studio প্রোজেক্ট খুলুন, src
প্যাকেজে ডানদিকের বোতামে ক্লিক করুন এবং নতুন... <gt; অন্যান্য > Slice Provider। এটি একটি ক্লাস তৈরি করে
যা SliceProvider-কে এক্সটেন্ড করে, আপনার AndroidManifest.xml-এ
প্রয়োজনীয় প্রোভাইডার এন্ট্রি যোগ করে এবং প্রয়োজনীয় Slice ডিপেন্ডেন্সি যোগ করার জন্য
আপনার build.gradle-কে পরিবর্তন করে।
AndroidManifest.xml-এ করা পরিবর্তন নিচে দেখানো হয়েছে:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.app"> ... <application> ... <provider android:name="MySliceProvider" android:authorities="com.example.android.app" android:exported="true" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.app.slice.category.SLICE" /> </intent-filter> </provider> ... </application> </manifest>
নিম্নলিখিত ডিপেন্ডেন্সি আপনার build.gradle-এ যোগ করা হয়েছে:
Kotlin
dependencies { // ... implementation "androidx.slice:slice-builders-ktx:(latest version)" // ... }
জাভা
dependencies { // ... implementation "androidx.slice:slice-builders:(latest version)" // ... }
প্রতিটি Slice-এর সাথে একটি URI যুক্ত থাকে। কোনও সারফেস Slice দেখাতে চাইলে, এটি
এই URI সহ আপনার অ্যাপে বাইন্ডিং অনুরোধ পাঠায়। আপনার অ্যাপ তখন এই
অনুরোধটি ম্যানেজ করে এবং
onBindSlice
পদ্ধতির মাধ্যমে ডায়নামিকভাবে Slice তৈরি করে। তারপর সারফেস উপযুক্ত সময়ে Slice দেখাতে পারে।
নিচে onBindSlice পদ্ধতির একটি উদাহরণ দেওয়া হল যা /hello URI
পাথ চেক করে এবং Hello World স্লাইস রিটার্ন করে:
Kotlin
override fun onBindSlice(sliceUri: Uri): Slice? { val activityAction = createActivityAction() return if (sliceUri.path == "/hello") { list(context, sliceUri, ListBuilder.INFINITY) { row { primaryAction = activityAction title = "Hello World." } } } else { list(context, sliceUri, ListBuilder.INFINITY) { row { primaryAction = activityAction title = "URI not recognized." } } } }
জাভা
@Override public Slice onBindSlice(Uri sliceUri) { if (getContext() == null) { return null; } SliceAction activityAction = createActivityAction(); ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY); // Create parent ListBuilder. if ("/hello".equals(sliceUri.getPath())) { listBuilder.addRow(new ListBuilder.RowBuilder() .setTitle("Hello World") .setPrimaryAction(activityAction) ); } else { listBuilder.addRow(new ListBuilder.RowBuilder() .setTitle("URI not recognized") .setPrimaryAction(activityAction) ); } return listBuilder.build(); }
Slice Viewer-এ Hello World Slice দেখার জন্য,
উপরে Slice Viewer বিভাগে আপনার তৈরি করা slice রান কনফিগারেশন ব্যবহার করুন,
আপনার Slice URI (যেমন, slice-content://com.android.example.slicesample/hello)
পাস করুন।

ইন্টার্যাক্টিভ স্লাইস
বিজ্ঞপ্তির মতোই, আপনি PendingIntent অবজেক্ট অ্যাটাচ করে আপনার Slice-এর মধ্যে ক্লিক ম্যানেজ করতে পারবেন,
যা ব্যবহারকারীর ইন্টার্যাকশনের মাধ্যমে ট্রিগার করা হয়। নিচের উদাহরণটি একটি
Activity শুরু করে যা সেইসব ইনটেন্ট গ্রহণ ও ম্যানেজ করতে পারে:
Kotlin
fun createSlice(sliceUri: Uri): Slice { val activityAction = createActivityAction() return list(context, sliceUri, INFINITY) { row { title = "Perform action in app" primaryAction = activityAction } } } fun createActivityAction(): SliceAction { val intent = Intent(context, MainActivity::class.java) return SliceAction.create( PendingIntent.getActivity(context, 0, Intent(context, MainActivity::class.java), 0), IconCompat.createWithResource(context, R.drawable.ic_home), ListBuilder.ICON_IMAGE, "Enter app" ) }
জাভা
public Slice createSlice(Uri sliceUri) { if (getContext() == null) { return null; } SliceAction activityAction = createActivityAction(); return new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY) .addRow(new ListBuilder.RowBuilder() .setTitle("Perform action in app.") .setPrimaryAction(activityAction) ).build(); } public SliceAction createActivityAction() { if (getContext() == null) { return null; } return SliceAction.create( PendingIntent.getActivity( getContext(), 0, new Intent(getContext(), MainActivity.class), 0 ), IconCompat.createWithResource(getContext(), R.drawable.ic_home), ListBuilder.ICON_IMAGE, "Enter app" ); }

স্লাইস অন্যান্য ইনপুট টাইপও সাপোর্ট করে, যেমন টগল, যার মধ্যে অ্যাপে পাঠানো ইনটেন্টের স্টেট অন্তর্ভুক্ত থাকে।
Kotlin
fun createBrightnessSlice(sliceUri: Uri): Slice { val toggleAction = SliceAction.createToggle( createToggleIntent(), "Toggle adaptive brightness", true ) return list(context, sliceUri, ListBuilder.INFINITY) { row { title = "Adaptive brightness" subtitle = "Optimizes brightness for available light" primaryAction = toggleAction } inputRange { inputAction = (brightnessPendingIntent) max = 100 value = 45 } } } fun createToggleIntent(): PendingIntent { val intent = Intent(context, MyBroadcastReceiver::class.java) return PendingIntent.getBroadcast(context, 0, intent, 0) }
জাভা
public Slice createBrightnessSlice(Uri sliceUri) { if (getContext() == null) { return null; } SliceAction toggleAction = SliceAction.createToggle( createToggleIntent(), "Toggle adaptive brightness", true ); ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY) .addRow(new ListBuilder.RowBuilder() .setTitle("Adaptive brightness") .setSubtitle("Optimizes brightness for available light.") .setPrimaryAction(toggleAction) ).addInputRange(new ListBuilder.InputRangeBuilder() .setInputAction(brightnessPendingIntent) .setMax(100) .setValue(45) ); return listBuilder.build(); } public PendingIntent createToggleIntent() { Intent intent = new Intent(getContext(), MyBroadcastReceiver.class); return PendingIntent.getBroadcast(getContext(), 0, intent, 0); }
রিসিভার তখন এটি যে স্টেট রিসিভ করে তা চেক করতে পারে:
Kotlin
class MyBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.hasExtra(Slice.EXTRA_TOGGLE_STATE)) { Toast.makeText(context, "Toggled: " + intent.getBooleanExtra( Slice.EXTRA_TOGGLE_STATE, false), Toast.LENGTH_LONG).show() } } companion object { const val EXTRA_MESSAGE = "message" } }
জাভা
public class MyBroadcastReceiver extends BroadcastReceiver { public static String EXTRA_MESSAGE = "message"; @Override public void onReceive(Context context, Intent intent) { if (intent.hasExtra(EXTRA_TOGGLE_STATE)) { Toast.makeText(context, "Toggled: " + intent.getBooleanExtra( EXTRA_TOGGLE_STATE, false), Toast.LENGTH_LONG).show(); } } }

ডায়নামিক স্লাইস
স্লাইসে পরিবর্তনশীল কন্টেন্টও থাকতে পারে। নিচের উদাহরণে, Slice-এ এখন এর কন্টেন্টে প্রাপ্ত ব্রডকাস্টের সংখ্যা অন্তর্ভুক্ত রয়েছে:
Kotlin
fun createDynamicSlice(sliceUri: Uri): Slice { return when (sliceUri.path) { "/count" -> { val toastAndIncrementAction = SliceAction.create( createToastAndIncrementIntent("Item clicked."), actionIcon, ListBuilder.ICON_IMAGE, "Increment." ) list(context, sliceUri, ListBuilder.INFINITY) { row { primaryAction = toastAndIncrementAction title = "Count: ${MyBroadcastReceiver.receivedCount}" subtitle = "Click me" } } } else -> { list(context, sliceUri, ListBuilder.INFINITY) { row { primaryAction = createActivityAction() title = "URI not found." } } } } }
জাভা
public Slice createDynamicSlice(Uri sliceUri) { if (getContext() == null || sliceUri.getPath() == null) { return null; } ListBuilder listBuilder = new ListBuilder(getContext(), sliceUri, ListBuilder.INFINITY); switch (sliceUri.getPath()) { case "/count": SliceAction toastAndIncrementAction = SliceAction.create( createToastAndIncrementIntent("Item clicked."), actionIcon, ListBuilder.ICON_IMAGE, "Increment." ); listBuilder.addRow( new ListBuilder.RowBuilder() .setPrimaryAction(toastAndIncrementAction) .setTitle("Count: " + MyBroadcastReceiver.sReceivedCount) .setSubtitle("Click me") ); break; default: listBuilder.addRow( new ListBuilder.RowBuilder() .setPrimaryAction(createActivityAction()) .setTitle("URI not found.") ); break; } return listBuilder.build(); } public PendingIntent createToastAndIncrementIntent(String s) { Intent intent = new Intent(getContext(), MyBroadcastReceiver.class) .putExtra(MyBroadcastReceiver.EXTRA_MESSAGE, s); return PendingIntent.getBroadcast(getContext(), 0, intent, 0); }
এই উদাহরণে, সংখ্যা দেখানো হলেও, এটি নিজে থেকে আপডেট হয় না। আপনি
ContentResolver#notifyChange
ব্যবহার করে
আপনার ব্রডকাস্ট রিসিভারকে পরিবর্তন করতে পারেন যাতে সিস্টেমকে জানানো যায় যে কোনও পরিবর্তন হয়েছে।
Kotlin
class MyBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.hasExtra(Slice.EXTRA_TOGGLE_STATE)) { Toast.makeText( context, "Toggled: " + intent.getBooleanExtra( Slice.EXTRA_TOGGLE_STATE, false ), Toast.LENGTH_LONG ).show() receivedCount++; context.contentResolver.notifyChange(sliceUri, null) } } companion object { var receivedCount = 0 val sliceUri = Uri.parse("content://com.android.example.slicesample/count") const val EXTRA_MESSAGE = "message" } }
জাভা
public class MyBroadcastReceiver extends BroadcastReceiver { public static int sReceivedCount = 0; public static String EXTRA_MESSAGE = "message"; private static Uri sliceUri = Uri.parse("content://com.android.example.slicesample/count"); @Override public void onReceive(Context context, Intent intent) { if (intent.hasExtra(EXTRA_TOGGLE_STATE)) { Toast.makeText(context, "Toggled: " + intent.getBooleanExtra( EXTRA_TOGGLE_STATE, false), Toast.LENGTH_LONG).show(); sReceivedCount++; context.getContentResolver().notifyChange(sliceUri, null); } } }

টেমপ্লেট
স্লাইসে বিভিন্ন ধরনের টেমপ্লেট ব্যবহার করা যায়। টেমপ্লেট বিকল্প ও আচরণ সম্পর্কে আরও জানতে, টেমপ্লেট দেখুন।