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