<p>INTRODUCTION xxxi</p> <p><b>CHAPTER 1: HELLO, ANDROID 1</b></p> <p>Android Application Development 1</p> <p>A Little Background 2</p> <p>The Not-So-Distant Past 3</p> <p>Living in the Future 3</p> <p>The Android Ecosystem 3</p> <p>Pre-installed Android Applications 4</p> <p>Android SDK Features 5</p> <p>What Does Android Run On? 6</p> <p>Why Develop for Mobile? 6</p> <p>Why Develop for Android? 7</p> <p>Introducing the Development Framework 7</p> <p>What Comes in the Box 8</p> <p>Understanding the Android Software Stack 8</p> <p>The Android Run Time 10</p> <p>Android Application Architecture 11</p> <p>Android Libraries 12</p> <p><b>CHAPTER 2: GETTING STARTED 13</b></p> <p>Getting Started Developing Android Apps 14</p> <p>Developing for Android 15</p> <p>What You Need to Begin 15</p> <p>Creating Your First Android Application 20</p> <p>Getting Started Writing Android Apps Using Kotlin 35</p> <p>Using the Android Support Library Package 36</p> <p>Developing for Mobile and Embedded Devices 39</p> <p>Hardware-Imposed Design Considerations 39</p> <p>Considering the User’s Environment 43</p> <p>Developing for Android 44</p> <p>Android Development Tools 48</p> <p>Android Studio 49</p> <p>The Android Virtual Device Manager 51</p> <p>The Android Emulator 51</p> <p>Android Profiler 52</p> <p>The Android Debug Bridge 54</p> <p>APK Analyzer 54</p> <p>The Lint Tool 55</p> <p>Monkey, Monkey Runner, and Espresso UI Testing 55</p> <p>Gradle 56</p> <p><b>CHAPTER 3: APPLICATIONS AND ACTIVITIES AND FRAGMENTS, OH MY! 57</b></p> <p>Applications, Activities, and Fragments 58</p> <p>The Components of an Android Application 58</p> <p>The Android Application Life Cycle, Priority, and Process States 59</p> <p>Introducing the Android Application Class 61</p> <p>A Closer Look at Android Activities 61</p> <p>Creating Activities 62</p> <p>Using the AppCompatActivity 63</p> <p>The Activity Life Cycle 64</p> <p>Responding to Memory Pressure 71</p> <p>Introducing Fragments 73</p> <p>Creating New Fragments 73</p> <p>The Fragment Life Cycle 74</p> <p>Introducing the Fragment Manager 79</p> <p>Adding Fragments to Activities 79</p> <p>Communicating Between Fragments and Activities 85</p> <p>Fragments without User Interfaces 86</p> <p>Building an Earthquake Viewer Application 87</p> <p><b>CHAPTER 4: DEFINING THE ANDROID MANIFEST AND GRADLE BUILD FILES, AND EXTERNALIZING RESOURCES 95</b></p> <p>The Manifest, Build Files, and Resources 96</p> <p>Introducing the Android Manifest 96</p> <p>Configuring the Gradle Build 101</p> <p>Gradle Settings File 101</p> <p>Project Gradle Build File 102</p> <p>Module Gradle Build Files 102</p> <p>Externalizing Resources 107</p> <p>Creating Resources 108</p> <p>Using Resources 119</p> <p>Creating Resources for Different Languages and Hardware 122</p> <p>Runtime Configuration Changes 126</p> <p><b>CHAPTER 5: BUILDING USER INTERFACES 129</b></p> <p>Fundamental Android Design 130</p> <p>Density-Independent Design 130</p> <p>Android User Interface Fundamentals 131</p> <p>Assigning User Interfaces to Activities 132</p> <p>Introducing Layouts 132</p> <p>Defining Layouts 134</p> <p>Using Layouts to Create Device-Independent User Interfaces 136</p> <p>Optimizing Layouts 139</p> <p>The Android Widget Toolbox 143</p> <p>Working with Lists and Grids 144</p> <p>Recycler View and Layout Managers 145</p> <p>Introducing Adapters 146</p> <p>Returning to the Earthquake Viewer Application 149</p> <p>Introducing Data Binding 150</p> <p>Enabling Data Binding 151</p> <p>Variables in Data Binding 152</p> <p>Data Binding for the Earthquake Viewer Application 153</p> <p>Creating New Views 155</p> <p>Modifying Existing Views 155</p> <p>Creating Compound Controls 159</p> <p>Creating Simple Compound Controls as a Layout 161</p> <p>Creating Custom Views 162</p> <p>Using Custom Controls 176</p> <p><b>CHAPTER 6: INTENTS AND BROADCAST RECEIVERS 177</b></p> <p>Using Intents and Broadcast Receivers 178</p> <p>Using Intents to Launch Activities 178</p> <p>Explicitly Starting New Activities 179</p> <p>Implicit Intents and Late Runtime Binding 179</p> <p>Determining If an Intent Will Resolve 180</p> <p>Returning Results from Activities 181</p> <p>Using Platform-Native Actions to Launch Activities 184</p> <p>Creating Intent Filters to Receive Implicit Intents 186</p> <p>Defining an Intent Filter 186</p> <p>Using Intent Filters for Plug-Ins and Extensibility 194</p> <p>Introducing Linkify 198</p> <p>Native Linkify Link Types 198</p> <p>Creating Custom Link Strings 199</p> <p>Using the Match Filter 200</p> <p>Using the Transform Filter 200</p> <p>Using Intents to Broadcast Events 200</p> <p>Broadcasting Events with Intents 201</p> <p>Listening for Intent Broadcasts with Broadcast Receivers 202</p> <p>Registering Broadcast Receivers in Code 203</p> <p>Registering Broadcast Receivers in Your Application Manifest 204</p> <p>Managing Manifest Receivers at Run Time 204</p> <p>Monitoring Device State Changes through Broadcast Intents 205</p> <p>Introducing the Local Broadcast Manager 207</p> <p>Introducing Pending Intents 208</p> <p><b>CHAPTER 7: USING INTERNET RESOURCES 211</b></p> <p>Connecting to the Internet 211</p> <p>Connecting, Downloading, and Parsing Internet Resources 212</p> <p>Why Build a Native Internet App? 212</p> <p>Connecting to an Internet Resource 213</p> <p>Performing Network Operations on Background Threads Using View Models, Live Data, and Asynchronous Tasks 214</p> <p>Parsing XML Using the XML Pull Parser 219</p> <p>Connecting the Earthquake Viewer to the Internet 220</p> <p>Parsing JSON Using the JSON Parser 228</p> <p>Using the Download Manager 233</p> <p>Downloading Files 233</p> <p>Customizing Download Manager Notifications 235</p> <p>Specifying a Download Location 237</p> <p>Canceling and Removing Downloads 238</p> <p>Querying the Download Manager 238</p> <p>Best Practices for Downloading Data without Draining the Battery 241</p> <p>An Introduction to Internet Services and Cloud Computing 242</p> <p><b>CHAPTER 8: FILES, SAVING STATE, AND USER PREFERENCES 245</b></p> <p>Saving Files, States, and Preferences 246</p> <p>Saving and Restoring Activity and Fragment Instance</p> <p>State Using the Lifecycle Handlers 246</p> <p>Retaining Instance State with Headless Fragments and View Models 248</p> <p>View Models and Live Data 248</p> <p>Headless Fragments 251</p> <p>Creating and Saving Shared Preferences 252</p> <p>Retrieving Shared Preferences 253</p> <p>Introducing On Shared Preference Change Listeners 254</p> <p>Configuring Auto Backup of Application Files and Shared Preferences 254</p> <p>Building a Preference UI 256</p> <p>Using the Preference Support Library 256</p> <p>Defining a Preference Screen Layout in XML 257</p> <p>Introducing the Preference Fragment 260</p> <p>Creating a Settings Activity for the Earthquake Monitor 261</p> <p>Including Static Files as Resources 267</p> <p>Working with the Filesystem 267</p> <p>File-Management Tools 267</p> <p>Creating Files on Application-Specifi c Internal Storage 268</p> <p>Creating Files on Application-Specifi c External Storage 268</p> <p>Accessing Public Directories Using Scoped Directory Access 270</p> <p>Sharing Files Using File Provider 274</p> <p>Creating a File Provider 274</p> <p>Sharing a File Using a File Provider 275</p> <p>Receiving a File from a File Provider 275</p> <p>Accessing Files from Other Applications Using the Storage Access Framework 275</p> <p>Requesting Temporary Access to Files 276</p> <p>Requesting Persistent Access to Files 277</p> <p>Requesting Access to Directories 277</p> <p>Creating New Files 278</p> <p>Using URI-Based Permissions 278</p> <p><b>CHAPTER 9: CREATING AND USING DATABASES 281</b></p> <p>Introducing Structured Data Storage in Android 282</p> <p>Storing Data Using the Room Persistence Library 282</p> <p>Adding the Room Persistence Library 283</p> <p>Defining a Room Database 284</p> <p>Persisting Complex Objects Using Type Convertors 286</p> <p>Defining Room Database Interactions Using Data Access Objects 288</p> <p>Performing Room Database Interactions 291</p> <p>Monitoring Query Result Changes with Live Data 292</p> <p>Persisting Earthquakes to a Database with Room 294</p> <p>Working with SQLite Databases 298</p> <p>Input Validation and SQL Injection 299</p> <p>Cursors and Content Values 299</p> <p>Defining a Database Contract 300</p> <p>Introducing the SQLiteOpenHelper 300</p> <p>Opening Databases with the SQLite Open Helper 302</p> <p>Opening and Creating Databases without the SQLite Open Helper 303</p> <p>Adding, Updating, and Deleting Rows 303</p> <p>Querying a Database 305</p> <p>Extracting Values from a Cursor 307</p> <p>Introducing the Firebase Realtime Database 308</p> <p>Adding Firebase to Your App 309</p> <p>Defining a Firebase Database and Defining Access Rules 311</p> <p>Adding, Modifying, Deleting, and Querying Data from a Firebase Realtime Database 313</p> <p><b>CHAPTER 10: CONTENT PROVIDERS AND SEARCH 317</b></p> <p>Introducing Content Providers 318</p> <p>Why Should I Use Content Providers? 318</p> <p>Creating Content Providers 319</p> <p>Creating the Content Provider’s Database 320</p> <p>Registering Content Providers 321</p> <p>Publishing Your Content Provider’s URI Address 321</p> <p>Implementing Content Provider Queries 322</p> <p>Content Provider Transactions 325</p> <p>Sharing Files Using a Content Provider 327</p> <p>Adding Permission Requirements to Content Providers 328</p> <p>Accessing Content Providers with Content Resolvers 330</p> <p>Querying Content Providers 330</p> <p>Cancelling Queries 333</p> <p>Querying for Content Asynchronously with a Cursor Loader 333</p> <p>Adding, Deleting, and Updating Content 336</p> <p>Accessing Files Stored in Content Providers 338</p> <p>Accessing Permission-Restricted Content Providers 339</p> <p>Using Native Android Content Providers 341</p> <p>Accessing the Call Log 341</p> <p>Using the Media Store Content Provider 342</p> <p>Using the Contacts Content Provider 344</p> <p>Using the Calendar Content Provider 351</p> <p>Adding Search to Your Application 354</p> <p>Defining Your Search Metadata 354</p> <p>Creating a Search Results Activity 355</p> <p>Searching a Content Provider 357</p> <p>Using the Search View Widget 360</p> <p>Providing Search Suggestions Using a Content Provider 362</p> <p><b>CHAPTER 11: WORKING IN THE BACKGROUND 377</b></p> <p>Working in the Background 378</p> <p>Using Background Threads 379</p> <p>Using Asynchronous Tasks to Run Tasks Asynchronously 379</p> <p>Manual Thread Creation Using Handler Threads 383</p> <p>Scheduling Background Jobs 385</p> <p>Creating a Job Service for the Job Scheduler 386</p> <p>Scheduling Jobs with the Job Scheduler 388</p> <p>Scheduling Jobs with the Firebase Job Dispatcher 391</p> <p>Scheduling Work with the Work Manager 393</p> <p>An Earthquake-Monitoring Job Service Example 396</p> <p>Using Notifications to Notify Users 401</p> <p>Introducing the Notification Manager 401</p> <p>Working with Notification Channels 402</p> <p>Creating Notifications 403</p> <p>Setting a Notification’s Priority 407</p> <p>Adding Notification Actions 411</p> <p>Adding Direct Reply Actions 412</p> <p>Grouping Multiple Notifications 413</p> <p>Adding Notifications to the Earthquake Monitor 414</p> <p>Using Firebase Cloud Messaging 417</p> <p>Triggering Notifications Remotely with Firebase Notifications 418</p> <p>Receiving Data with Firebase Cloud Messaging 421</p> <p>Using Alarms 422</p> <p>Creating, Setting, and Canceling Alarms 423</p> <p>Setting an Alarm Clock 424</p> <p>Introducing Services 424</p> <p>Using Bound Services 425</p> <p>Creating a Started Service 427</p> <p><b>CHAPTER 12: IMPLEMENTING THE ANDROID</b></p> <p>DESIGN PHILOSOPHY 433</p> <p>Introducing the Android Design Philosophy 434</p> <p>Designing for Every Screen 434</p> <p>Resolution Independence 435</p> <p>Supporting and Optimizing for Different Screen Sizes 436</p> <p>Creating Scalable Graphics Assets 439</p> <p>Introducing Material Design 445</p> <p>Thinking in Terms of Paper and Ink 446</p> <p>Using Color and Keylines as Guides 447</p> <p>Continuity through Motion 449</p> <p>Material Design UI Elements 452</p> <p>The App Bar 452</p> <p>Applying Material Design to the Earthquake Monitor 455</p> <p>Using Cards to Display Content 456</p> <p>Floating Action Buttons 460</p> <p><b>CHAPTER 13: IMPLEMENTING A MODERN ANDROID USER EXPERIENCE 463</b></p> <p>The Modern Android UI 464</p> <p>Creating Consistent, Modern User Interfaces</p> <p>Using AppCompat 464</p> <p>Creating and Applying Themes Using AppCompat 465</p> <p>Creating Theme Overlays for Specific Views 466</p> <p>Adding a Menu and Actions to the App Bar 467</p> <p>Defining a Menu Resource 467</p> <p>Adding a Menu to an Activity 468</p> <p>Adding a Menu to a Fragment 469</p> <p>Updating Menu Items Dynamically 469</p> <p>Handling Menu Selections 470</p> <p>Adding Action Views and Action Providers 470</p> <p>Going Beyond the Default App Bar 472</p> <p>Replacing Your App Bar with a Toolbar 472</p> <p>Advanced Scrolling Techniques for the Toolbar 473</p> <p>Incorporating Menus without the App Bar 476</p> <p>Improving the Earthquake Monitor’s App Bar 477</p> <p>App Navigation Patterns 479</p> <p>Navigating with Tabs 479</p> <p>Implementing a Bottom Navigation Bar 482</p> <p>Using a Navigation Drawer 485</p> <p>Combining Navigation Patterns 491</p> <p>Adding Tabs to the Earthquake Monitor 492</p> <p>Choosing the Right Level of Interruption 496</p> <p>Initiating a Dialog 497</p> <p>Let’s Make a Toast 498</p> <p>Inline Interruptions with Snackbars 499</p> <p><b>CHAPTER 14: ADVANCED CUSTOMIZATION OF YOUR USER INTERFACE 501</b></p> <p>Expanding the User Experience 502</p> <p>Supporting Accessibility 502</p> <p>Supporting Navigation without a Touch Screen 502</p> <p>Providing a Textual Description of Each View 503</p> <p>Introducing Android Text-to-Speech 503</p> <p>Using Speech Recognition 505</p> <p>Using Speech Recognition for Voice Input 506</p> <p>Using Speech Recognition for Search 507</p> <p>Controlling Device Vibration 508</p> <p>Going Full Screen 508</p> <p>Working with Property Animations 510</p> <p>Enhancing Your Views 513</p> <p>Advanced Canvas Drawing 514</p> <p>Creating Interactive Controls 530</p> <p>Composite Drawable Resources 536</p> <p>Transformative Drawables 536</p> <p>Layer Drawables 537</p> <p>State List Drawables 537</p> <p>Level List Drawables 538</p> <p>Copy, Paste, and the Clipboard 539</p> <p>Copying Data to the Clipboard 539</p> <p>Pasting Clipboard Data 539</p> <p><b>CHAPTER 15: LOCATION, CONTEXTUAL AWARENESS,AND MAPPING 541</b></p> <p>Adding Location, Maps, and Contextual Awareness to Your</p> <p>Applications 542</p> <p>Introducing Google Play Services 542</p> <p>Adding Google Play Services to Your Application 543</p> <p>Determining the Availability of Google Play Services 545</p> <p>Finding Device Location Using Google Location Services 546</p> <p>Using the Emulator to Test Location-Based Functionality 548</p> <p>Finding the Last Known Location 549</p> <p>“Where Am I” Example 551</p> <p>Requesting Location Change Updates 555</p> <p>Changing Device Location Settings 560</p> <p>Updating the Location in the “Where Am I” Example 563</p> <p>Best Practices When Using Location 566</p> <p>Setting and Managing Geofences 567</p> <p>Using the Legacy Platform Location-Based Services 571</p> <p>Selecting a Location Provider 572</p> <p>Finding the Last Known Location 574</p> <p>Requesting Location Change Updates 575</p> <p>Best Practice for Using the Legacy Location-Based Services 577</p> <p>Using the Geocoder 580</p> <p>Reverse Geocoding 581</p> <p>Forward Geocoding 582</p> <p>Geocoding Where Am I 583</p> <p>Creating Map-Based Activities 585</p> <p>Getting Your Maps API Key 586</p> <p>Creating a Map-Based Activity 586</p> <p>Configuring Google Maps 589</p> <p>Changing the Camera Position with Camera Updates 590</p> <p>Mapping Where Am I 592</p> <p>Displaying the Current Location with the My Location Layer 596</p> <p>Displaying Interactive Map Markers 596</p> <p>Adding Shapes to Google Maps 599</p> <p>Adding Image Overlays to Google Maps 602</p> <p>Adding Markers and Shapes to Where Am I 602</p> <p>Mapping the Earthquake Example 605</p> <p>Adding Contextual Awareness 609</p> <p>Connecting to the Google Play Services API Client and Obtaining API Keys 610</p> <p>Using Awareness Snapshots 612</p> <p>Setting and Monitoring Awareness Fences 613</p> <p>Awareness Best Practices 617</p> <p><b>CHAPTER 16: HARDWARE SENSORS 619</b></p> <p>Introducing Android Sensors 620</p> <p>Using the Sensor Manager 620</p> <p>Understanding the Android Sensors 621</p> <p>Discovering and Identifying Sensors 623</p> <p>Determining Sensor Capabilities 625</p> <p>Wakeup and Non-Wakeup Sensors 627</p> <p>Monitoring Sensor Results 627</p> <p>Interpreting Sensor Values 632</p> <p>Testing Sensors with the Android Virtual Device and Emulator 635</p> <p>Best Practices for Working with Sensors 637</p> <p>Monitoring a Device’s Movement and Orientation 637</p> <p>Determining the Natural Orientation of a Device 638</p> <p>Introducing Accelerometers 639</p> <p>Detecting Acceleration Changes 640</p> <p>Creating a Gravitational Force Meter 642</p> <p>Determining a Device’s Orientation 645</p> <p>Creating a Compass and Artificial Horizon 650</p> <p>Using the Environmental Sensors 654</p> <p>Using the Barometer Sensor 654</p> <p>Creating a Weather Station 655</p> <p>Using Body Sensors 659</p> <p>User Activity Recognition 662</p> <p><b>CHAPTER 17: AUDIO, VIDEO, AND USING THE CAMERA 665</b></p> <p>Playing Audio and Video, and Using the Camera 666</p> <p>Playing Audio and Video 666</p> <p>Introducing the Media Player 667</p> <p>Using Media Player for Video Playback 669</p> <p>Using ExoPlayer for Video Playback 672</p> <p>Requesting and Managing Audio Focus 674</p> <p>Pausing Playback When the Output Changes 676</p> <p>Responding to the Volume Controls 677</p> <p>Working with a Media Session 678</p> <p>Using the Media Router and Cast Application Framework 682</p> <p>Background Audio Playback 686</p> <p>Building an Audio Playback Service 686</p> <p>Using a Media Browser to Connect Your Activity to a</p> <p>Media Browser Service 688</p> <p>Life Cycle of a Media Browser Service 690</p> <p>Playing Audio as a Foreground Service 691</p> <p>Creating Media Style Notifications 693</p> <p>Using the Media Recorder to Record Audio 695</p> <p>Using the Camera for Taking Pictures 697</p> <p>Using Intents to Take Pictures 697</p> <p>Controlling the Camera Directly 699</p> <p>Reading and Writing JPEG EXIF Image Details 706</p> <p>Recording Video 706</p> <p>Using Intents to Record Video 707</p> <p>Using the Media Recorder to Record Video 707</p> <p>Adding Media to the Media Store 710</p> <p>Inserting Media Using the Media Scanner 710</p> <p>Inserting Media Manually 711</p> <p><b>CHAPTER 18: COMMUNICATING WITH BLUETOOTH,NFC, AND WI-FI PEER-TO-PEER 713</b></p> <p>Networking and Peer-to-Peer Communication 713</p> <p>Transferring Data Using Bluetooth 714</p> <p>Managing the Local Bluetooth Device Adapter 714</p> <p>Being Discoverable and Remote Device Discovery 716</p> <p>Bluetooth Communications 720</p> <p>Bluetooth Profiles 725</p> <p>Bluetooth Low Energy 726</p> <p>Transferring Data Using Wi-Fi Peer-to-Peer 728</p> <p>Initializing the Wi-Fi Peer-to-Peer Framework 729</p> <p>Discovering Peers 731</p> <p>Connecting with Peers 732</p> <p>Transferring Data between Peers 733</p> <p>Using Near Field Communication 735</p> <p>Reading NFC Tags 735</p> <p>Using the Foreground Dispatch System 736</p> <p>Using Android Beam 738</p> <p>Creating Android Beam Messages 739</p> <p>Assigning the Android Beam Payload 740</p> <p>Receiving Android Beam Messages 742</p> <p><b>CHAPTER 19: INVADING THE HOME SCREEN 743</b></p> <p>Customizing the Home Screen 743</p> <p>Introducing Home Screen Widgets 744</p> <p>Defining the Widget Layout 745</p> <p>Defining Your Widget Size and Other Metadata 746</p> <p>Implementing Your Widget 748</p> <p>Updating the Widget UI Using the App Widget Manager and Remote Views 749</p> <p>Forcing Refreshes of Your Widget Data and UI 753</p> <p>Creating and Using a Widget Configuration Activity 756</p> <p>Creating an Earthquake Widget 757</p> <p>Introducing Collection View Widgets 763</p> <p>Creating Collection View Widget Layouts 764</p> <p>Updating Collection View Items with a Remote Views Factory 765</p> <p>Updating Collection View Items with a Remote Views Service 767</p> <p>Populating Collection View Widgets Using a Remote Views Service 768</p> <p>Adding Interactivity to the Items within a Collection View Widget 769</p> <p>Refreshing Your Collection View Widgets 770</p> <p>Creating an Earthquake Collection View Widget 770</p> <p>Creating Live Wallpaper 777</p> <p>Creating a Live Wallpaper Definition Resource 778</p> <p>Creating a Wallpaper Service Engine 778</p> <p>Creating a Wallpaper Service 780</p> <p>Creating App Shortcuts 781</p> <p>Static Shortcuts 783</p> <p>Dynamic Shortcuts 784</p> <p>Tracking App Shortcut Use 785</p> <p><b>CHAPTER 20: ADVANCED ANDROID DEVELOPMENT 787</b></p> <p>Advanced Android 788</p> <p>Paranoid Android 788</p> <p>Linux Kernel Security 788</p> <p>Re-introducing Permissions 789</p> <p>Storing Keys in the Android Keystore 792</p> <p>Using the Fingerprint Sensor 792</p> <p>Dealing with Different Hardware and Software Availability 793</p> <p>Specifying Required Hardware 794</p> <p>Confirming Hardware Availability 795</p> <p>Building Backward-Compatible Applications 795</p> <p>Optimizing UI Performance with Strict Mode 797</p> <p>Telephony and SMS 798</p> <p>Telephony 799</p> <p>Sending and Receiving SMS Messages 806</p> <p><b>CHAPTER 21: RELEASING, DISTRIBUTING, AND MONITORING APPLICATIONS 825</b></p> <p>Preparing for Release 826</p> <p>Preparing Release Support Material 826</p> <p>Preparing Your Code for a Release Build 827</p> <p>Updating Application Metadata in Your Application Manifest 828</p> <p>Reviewing Application Installation Restrictions 828</p> <p>Application Versioning 830</p> <p>Signing Production Builds of Your Application 830</p> <p>Creating a Keystore and Signing Key with Android Studio 832</p> <p>Obtaining API Keys Based on Your Private Release Key 833</p> <p>Building and Signing a Production Release 834</p> <p>Distributing Your Application on the Google Play Store 835</p> <p>Introducing the Google Play Store 835</p> <p>Getting Started with the Google Play Store 836</p> <p>Creating an Application on the Google Play Store 837</p> <p>Publishing Your Application 845</p> <p>Monitoring Your Application in Production 848</p> <p>An Introduction to Monetizing Applications 853</p> <p>Application Marketing, Promotion, and Distribution Strategies 854</p> <p>Application Launch Strategies 854</p> <p>Internationalization 855</p> <p>Using Firebase to Monitor Your Application 856</p> <p>Adding Firebase to Your Application 856</p> <p>Using Firebase Analytics 857</p> <p>Firebase Performance Monitoring 860</p> <p>INDEX 863</p>