leaderboard 1

Showing posts with label google android. Show all posts
Showing posts with label google android. Show all posts

Tuesday, 29 September 2015

How to use Android Lollipop’s notification and interruption?

How to use Android Lollipop’s notification and interruption?


A complete guide on mastering Android Lollipop's notification and interruption

I. What is the new Android Lollipop’s notification and interruption system?

One of the biggest changes in Android Lollipop is the notification system. To certain extent, the Android Lollipop’s notification is totally new. It is fundamentally different from the notification system in previous Android devices.
Android Lollipop’s notification and interruption system treats all notifications and alert as interruptions. You can control when and how you receive notifications and alerts so that  you will get interrupted only when you want to be.
The major new features in Android Lollipop’s notification and interruption system includes:
  • Choose from 3 modes: all, none and priority.
  • View and respond to messages directly from your lock screen.
  • Hide sensitive content in notifications.
  • Prioritize notifications from apps.
  • Rank notifications based on who they’re from and the type of communication.
  • Stop interruption of incoming calls.
  • Setup and use downtime.
  • Hide sensitive notifications from lock screen.
  • and more…

II. What’s the meaning of the three modes in Android Lollipop’s notification and interruption?

When pressing the volume button (volume up or down), you can quickly switch among the 3 modes in Android Lollipop’s notification and interruption system.

Mode 1: All mode

In All mode, as suggested by the name, you turn on all notification and alerts in your device.  In other words, you will get notifications and alerts  from the system and all apps except those that you turned off notifications explicitly.
There are a few settings will overwrite the All mode in Android Lollipop’s notification. One is individual app notification setting. If you set notification from certain apps as Blockyou will not net get notifications or interruptions from these apps in All  mode.
Downtime settings will also overwrite this All mode.
In All Mode, you can lower the volume all the way down to vibrate mode. This essentially silence your Android Lollipop device as in old Android versions.
In Android Lollipop, there is no separate vibrate mode. You just lower the volume down to silence the device.  In this vibrate mode, you will still get notifications and alerts without notifications tones.

Mode 2: None mode

None mode is the other extreme. In this mode, all notifications tones will be turned off, including the Alarm and the ringer.
Please note, none mode stops audio interruptions only. In other words, text notifications and notification icons will still shown on the screen. For example, when a SMS message arrives, it will notify you on the screen.
If you want to turn off all notifications, you need use downtime feature.
When None mode is activated, you will see a special icon in the stats bar as shown below.
how_to_set_notification_and_interruptions_in_android_lollipop_13_none_icon

Mode 3: Priority mode

Priority mode allows certain notifications to interrupt you. You assign which app is in your priority list so that it may interrupt you in the Priority mode.
Similar to that  in All mode, you can also lower the volume to vibrate mode. But vibrate mode under Priority mode still obeys the priority rules. In other words, apps that are not in your priority list can NOT vibrate the phone.
If Priority mode is activated, the stats bar will show a star icon as shown below.
how_to_set_notification_and_interruptions_in_android_lollipop_13_priority_icon

III. How to setup and change the 3 notification modes in Android Lollipop’s notification and interruptions?

There are at least two ways to setup or change the  3 notifications modes in Android Lollipop’s notification and interruption system.

Method 1: Tap volume button.

Once you tap the volume button (it doesn’t matter it is volume up or volume down), in addition to  normal volume level settings on the top as shown below, you get the options  to switch among the 3 notification modes: None, Priority and All.
This is the quickest way to switch the notification modes in Android Lollipop’s notification and interruptions.
how_to_set_notification_and_interruptions_in_android_lollipop_1_tap_volume_button
If you tap any of the notification modes, you  will also be offered the option to set the duration for this change as (as shown below):
  • Indefinitely. The notification will stick in this mode until you manually change it again.
  • A few hours.  After this period, the notification will change back to current mode automatically.  For example, you have a meeting and you want to change the notification to None for next 2 hours. After 2 hours, the notification and interruption mode will revert back automatically.
As shown in the screenshot below, you can adjust the duration by tapping he + or – button accordingly.
how_to_set_notification_and_interruptions_in_android_lollipop_2_change_modes

Method 2: Go to Settings–Sound and Notification –Interruptions.

You can access  Settings either from quick settings panel or from the Settings app in the app drawer.
In the Interruptions page, as shown below, you can tap “When calls and notification arrive” to select the notification and interruption modes quickly.
  • Always interrupt means All mode.
  • Allow only priority interruptions means Priority mode.
  • Don’t interrupt means None mode.
how_to_set_notification_and_interruptions_in_android_lollipop_3_settings_interruptions how_to_set_notification_and_interruptions_in_android_lollipop_4_choosing _notification_mode

IV. How to set up downtime in Android Lollipop’s notification and interruption?

Downtime is another useful feature in the new Android Lollipop’s notification and interruption system. It turn on Priority mode automatically in the specific time automatically, and repeatedly.
Some Lollipop users like to compare Downtime with Do Not Disturb in iPhones. They are similar. But Downtime is more powerful as  you can fine tune Priority interruptions.
The Downtime can save you a lot of time by avoiding to turn on/off Priority mode  again and again. For example,  you can specify your sleeping time or school time as Downtime so that only notifications from certain apps, or calls from certain contacts can distract you during this period. After this period, the notification mode will revert back to the one before downtime. It is not necessary for you to change it manually.
You can access Downtime settings to configure it from SettingsSound and Notification —Interruptions.
As shown in the screenshots below, you can set the days and time to enable Downtime automatically based on your scedule.
how_to_set_notification_and_interruptions_in_android_lollipop_5_downtime how_to_set_notification_and_interruptions_in_android_lollipop_6_downtime_time_setting

V. How to configure the priority mode in Android Lollipop’s notification and interruption?

It is very easy to  configure Priority mode in Lollipop. You only need configure:
  • Do you allow events or reminders? These interruptions are from your calendar or Google Keep.
  • Who can call you? Nobody or specific callers?
  • Who can message you? Nobody or specific callers?
  • Which apps can send notifications in Priority mode? You need set it in App notifications (see below)
When you enable calls and messages in Priority mode, you can allow calls or messages from certain people. You have 3 options (as shown below):
  • Anyone.
  • Contacts only. Only people matching contact info in your Contacts app can interrupt you.
  • Starred contacts only. Only contacts which you starred in your Contacts app can interrupt you.
how_to_set_notification_and_interruptions_in_android_lollipop_7_priority_interruptions how_to_set_notification_and_interruptions_in_android_lollipop_8_unblock_some_contacts

VI. How to set App notifications for Android Lollipop’s notification and interruption?

Android Lollipop’s notification and interruption system also allows you to customize the notification of individual apps. In old versions, you only have the option to turn app notification on or off. The Lollipop’s notification system allows fine control on notifications from all apps, including pre-installed apps.
To configure app notifications, you can go to SettingsSound  & notificationApp notifications as shown below.
Select the app as shown below. For example, we use Motorola Assist as an example.
how_to_set_notification_and_interruptions_in_android_lollipop_9_settings_app_notifications how_to_set_notification_and_interruptions_in_android_lollipop_10_select_app
After tapping  Assist, you will get the app notification page for this app.
You can choose
  1. Block. You essentially disable the notifications from this app. The app will not send any notifications forever. In other words, notifications through this app are automatically blocked.  This setting has identical effects of those of turning off notifications inSettings —Apps. Actually, once you choose Blocked in app notification page here, you will find the show notifications in App info page in SettingsApps will be turned off automatically.
  2. Priority. You will get notification from this app in both All mode and Priority mode. Notifications from this app can go through even you are in the Priority mode (and of course, during downtime.
These two options are mutually exclusive. Once you enable one (drag the switch to right to enable it), the other one will be disabled automatically.
If you set screen locks to PIN, pattern or anything except swipe or none, you have another option to declare notifications from this app as sensitive as shown below.
Sensitive notifications will be hidden from the lock screen.
how_to_set_notification_and_interruptions_in_android_lollipop_11_app_notification_block_priority how_to_set_notification_and_interruptions_in_android_lollipop_12_sensitive_notification

Can you use Android Lollipop’s notification and interruption now?

If you have any questions on using Android Lollipop’s notification and interruption or encounter any problems with the notifications in your Android Lollipop, please let us know them in the comment box below.
The community will help you.
For more Android Lollipop guides, please visit on Android Lollipop Guide page.

About Android

Android, the world's most popular mobile platform

Android powers hundreds of millions of mobile devices in more than 190 countries around the world. It's the largest installed base of any mobile platform and growing fast—every day another million users power up their Android devices for the first time and start looking for apps, games, and other digital content.
Android gives you a world-class platform for creating apps and games for Android users everywhere, as well as an open marketplace for distributing to them instantly.

Global partnerships and large installed base

Building on the contributions of the open-source Linux community and more than 300 hardware, software, and carrier partners, Android has rapidly become the fastest-growing mobile OS.
Every day more than a million new Android devices are activated worldwide.
Android’s openness has made it a favorite for consumers and developers alike, driving strong growth in app consumption. Android users download more than billions of apps and games from Google Play each month.
With its partners, Android is continuously pushing the boundaries of hardware and software forward to bring new capabilities to users and developers. For developers, Android innovation lets you build powerful, differentiated applications that use the latest mobile technologies.

Rapid innovation

Android is continuously pushing the boundaries of hardware and software forward, to bring new capabilities to users and developers. For developers, the rapid evolution of Android technology lets you stay in front with powerful, differentiated applications.
Android gives you access to the latest technologies and innovations across a multitude of device form-factors, chipset architectures, and price points. From multicore processing and high-performance graphics to state-of-the-art sensors, vibrant touchscreens, and emerging mobile technologies.

Powerful development framework

Easily optimize a single binary for phones, tablets, and other devices.
Android gives you everything you need to build best-in-class app experiences. It gives you a single application model that lets you deploy your apps broadly to hundreds of millions of users across a wide range of devices—from phones to tablets and beyond.
Android also gives you tools for creating apps that look great and take advantage of the hardware capabilities available on each device. It automatically adapts your UI to look its best on each device, while giving you as much control as you want over your UI on different device types.
For example, you can create a single app binary that's optimized for both phone and tablet form factors. You declare your UI in lightweight sets of XML resources, one set for parts of the UI that are common to all form factors and other sets for optimzations specific to phones or tablets. At runtime, Android applies the correct resource sets based on its screen size, density, locale, and so on.
To help you develop efficiently, the Android Developer Tools offer a full Java IDE with advanced features for developing, debugging, and packaging Android apps. Using the IDE, you can develop on any available Android device or create virtual devices that emulate any hardware configuration.
1.5 billion downloads a month and growing. Get your apps in front of millions of users at Google's scale.

Open marketplace for distributing your apps

Google Play is the premier marketplace for selling and distributing Android apps. When you publish an app on Google Play, you reach the huge installed base of Android.
As an open marketplace, Google Play puts you in control of how you sell your products. You can publish whenever you want, as often as you want, and to the customers you want. You can distribute broadly to all markets and devices or focus on specific segments, devices, or ranges of hardware capabilities.
You can monetize in the way that works best for your business—priced or free, with in-app products or subscriptions—for highest engagement and revenues. You also have complete control of the pricing for your apps and in-app products and can set or change prices in any supported currency at any time.
Beyond growing your customer base, Google Play helps you build visibility and engagement across your apps and brand. As your apps rise in popularity, Google Play gives them higher placement in weekly "top" charts and rankings, and for the best apps promotional slots in curated collections.
Preinstalled on hundreds of billions of Android devices around the world, Google Play can be a growth engine for your business.

Portions of this page are reproduced from work created and shared by the Android Open Source Project and used according to terms described in theCreative Commons 2.5 Attribution License.

Original Page Direct link:
http://developer.android.com/about/android.html

Android 4.1 APIs

Android 4.1 APIs


API Level: 16
Android 4.1 (JELLY_BEAN) is a progression of the platform that offers improved performance and enhanced user experience. It adds new features for users and app developers. This document provides an introduction to the most notable and useful new APIs for app developers.
As an app developer, Android 4.1 is available to you from the SDK Manager as a system image you can run in the Android emulator and an SDK platform against which you can build your app. You should download the system image and platform as soon as possible to build and test your app on Android 4.1.

App Components


Isolated services

By specifying android:isolatedProcess="true" in the <service> tag, yourService will run under its own isolated user ID process that has no permissions of its own.

Memory management

New ComponentCallbacks2 constants such asTRIM_MEMORY_RUNNING_LOW and TRIM_MEMORY_RUNNING_CRITICAL provide foreground processes more information about memory state before the system calls onLowMemory().
New getMyMemoryState(ActivityManager.RunningAppProcessInfo)method allows you to retrieve the general memory state.

Content providers

A new method, acquireUnstableContentProviderClient(), allows you to access a ContentProviderClient that may be "unstable" such that your app will not crash if the content provider does. It's useful when you are interacting with content providers in a separate app.

Live Wallpapers

New intent protocol to directly launch the live wallpaper preview activity so you can help users easily select your live wallpaper without forcing them to leave your app and navigate through the Home wallpaper picker.
To launch the live wallpaper picker, call startActivity() with an Intent using ACTION_CHANGE_LIVE_WALLPAPER and an extra that specifies your live wallpaper ComponentName as a string in EXTRA_LIVE_WALLPAPER_COMPONENT.

App stack navigation

Android 4.1 makes it much easier to implement the proper design patterns for Up navigation. All you need to do is add theandroid:parentActivityName to each <activity> element in your manifest file. The system uses this information to open the appropriate activity when the user presses the Up button in the action bar (while also finishing the current activity). So if you declare the android:parentActivityName for each activity, you don't need theonOptionsItemSelected() method to handle click events on the action bar's app icon—the system now handles that event and resumes or creates the appropriate activity.
This is particularly powerful for scenarios in which the user enters one of your app's activities through a "deep dive" intent such as from a notification or an intent from different app (as described in the design guide for Navigating Between Apps). When the user enters your activity this way, your app may not naturally have a back stack of activities that can be resumed as the user navigates up. However, when you supply the android:parentActivityName attribute for your activities, the system recognizes whether or not your app already contains a back stack of parent activities and, if not, constructs a synthetic back stack that contains all parent activities.
Note: When the user enters a deep activity in your app and it creates a new task for your app, the system actually inserts the stack of parent activities into the task. As such, pressing the Back button also navigates back through the stack of parent activities.
When the system creates a synthetic back stack for your app, it builds a basic Intent to create a new instance of each parent activity. So there's no saved state for the parent activities the way you'd expect had the user naturally navigated through each activity. If any of the parent activities normally show a UI that's dependent on the user's context, that context information will be missing and you should deliver it when the user navigates back through the stack. For example, if the user is viewing an album in a music app, navigating up might bring them to an activity that lists all albums in a chosen music genre. In this case, if the stack must be created, it's necessary that you inform the parent activity what genre the current album belongs to so that the parent can display the proper list as if the user actually came from that activity. To deliver such information to a synthetic parent activity, you must override the onPrepareNavigateUpTaskStack() method. This provides you with a TaskStackBuilder object that the system created in order to synthesize the parent activities. The TaskStackBuilder contains Intent objects that the system uses to create each parent activity. In your implementation of onPrepareNavigateUpTaskStack(), you can modify the appropriate Intent to add extra data that the parent activity can use to determine the appropriate context and display the appropriate UI.
When the system creates the TaskStackBuilder, it adds the Intent objects that are used to create the parent activities in their logical order beginning from the top of the activity tree. So, the last Intent added to the internal array is the direct parent of the current activity. If you want to modify the Intent for the activity's parent, first determine the length of the array with getIntentCount() and pass that value to editIntentAt().
If your app structure is more complex, there are several other APIs available that allow you to handle the behavior of Up navigation and fully customize the synthetic back stack. Some of the APIs that give you additional control include:
onNavigateUp()
Override this to perform a custom action when the user presses the Up button.
navigateUpTo(Intent)
Call this to finish the current activity and go to the activity indicated by the supplied Intent. If the activity exists in the back stack, but is not the closest parent, then all other activities between the current activity and the activity specified with the intent are finished as well.
getParentActivityIntent()
Call this to get the Intent that will start the logical parent for the current activity.
shouldUpRecreateTask(Intent)
Call this to query whether a synthetic back stack must be created in order to navigate up. Returns true if a synthetic stack must be created, false if the appropropriate stack already exists.
finishAffinity()
Call this to finish the current activity and all parent activities with the same task affinity that are chained to the current activity. If you override the default behaviors such as onNavigateUp(), you should call this method when you create a synthetic back stack upon Up navigation.
onCreateNavigateUpTaskStack
Override this if you need to fully control how the synthetic task stack is created. If you want to simply add some extra data to the intents for your back stack, you should instead override onPrepareNavigateUpTaskStack()
However, most apps don't need to use these APIs or implement onPrepareNavigateUpTaskStack(), but can can achieve the correct behavior simply by adding android:parentActivityName to each <activity> element.

Multimedia


Media codecs

The MediaCodec class provides access to low-level media codecs for encoding and decoding your media. You can instantiate a MediaCodec by calling createEncoderByType() to encode media or call createDecoderByType() to decode media. Each of these methods take a MIME type for the type of media you want to encode or decode, such as"video/3gpp" or "audio/vorbis".
With an instance of MediaCodec created, you can then call configure() to specify properties such as the media format or whether or not the content is encrypted.
Whether you're encoding or decoding your media, the rest of the process is the same after you create the MediaCodec. First call getInputBuffers() to get an array of input ByteBuffer objects and getOutputBuffers() to get an array of output ByteBuffer objects.
When you're ready to encode or decode, call dequeueInputBuffer() to get the index position of the ByteBuffer (from the array of input buffers) that you should use to to feed in your source media. After you fill the ByteBuffer with your source media, release ownership of the buffer by calling queueInputBuffer().
Likewise for the output buffer, call dequeueOutputBuffer() to get the index position of the ByteBuffer where you'll receive the results. After you read the output from the ByteBuffer, release ownership by callingreleaseOutputBuffer().
You can handle encrypted media data in the codecs by calling queueSecureInputBuffer() in conjunction with theMediaCrypto APIs, instead of the normal queueInputBuffer().
For more information about how to use codecs, see the MediaCodec documentation.

Record audio on cue

New method startRecording() allows you to begin audio recording based on a cue defined by a MediaSyncEvent. TheMediaSyncEvent specifies an audio session (such as one defined by MediaPlayer), which when complete, triggers the audio recorder to begin recording. For example, you can use this functionality to play an audio tone that indicates the beginning of a recording session and recording automatically begins so you don't have to manually synchronize the tone and the beginning of recording.

Timed text tracks

The MediaPlayer now handles both in-band and out-of-band text tracks. In-band text tracks come as a text track within an MP4 or 3GPP media source. Out-of-band text tracks can be added as an external text source viaaddTimedTextSource() method. After all external text track sources are added, getTrackInfo() should be called to get the refreshed list of all available tracks in a data source.
To set the track to use with the MediaPlayer, you must call selectTrack(), using the index position for the track you want to use.
To be notified when the text track is ready to play, implement the MediaPlayer.OnTimedTextListener interface and pass it to setOnTimedTextListener().

Audio effects

The AudioEffect class now supports additional audio pre-processing types when capturing audio:
  • Acoustic Echo Canceler (AEC) with AcousticEchoCanceler removes the contribution of the signal received from the remote party from the captured audio signal.
  • Automatic Gain Control (AGC) with AutomaticGainControl automatically normalizes the output of the captured signal.
  • Noise Suppressor (NS) with NoiseSuppressor removes background noise from the captured signal.
You can apply these pre-processor effects on audio captured with an AudioRecord using one of the AudioEffectsubclasses.
Note: It's not guaranteed that all devices support these effects, so you should always first check availability by callingisAvailable() on the corresponding audio effect class.

Gapless playback

You can now perform gapless playback between two separate MediaPlayer objects. At any time before your firstMediaPlayer finishes, call setNextMediaPlayer() and Android attempts to start the second player the moment that the first one stops.
Media router. The new APIs MediaRouter, MediaRouteActionProvider, and MediaRouteButton provide standard mechanisms and UI for choosing where to play media.

Camera


Auto focus movement

The new interface Camera.AutoFocusMoveCallback allows you to listen for changes to the auto focus movement. You can register your interface with setAutoFocusMoveCallback(). Then when the camera is in a continuous autofocus mode (FOCUS_MODE_CONTINUOUS_VIDEO or FOCUS_MODE_CONTINUOUS_PICTURE), you'll receive a call to onAutoFocusMoving(), which tells you whether auto focus has started moving or has stopped moving.

Camera sounds

The MediaActionSound class provides a simple set of APIs to produce standard sounds made by the camera or other media actions. You should use these APIs to play the appropriate sound when building a custom still or video camera.
To play a sound, simply instantiate a MediaActionSound object, call load() to pre-load the desired sound, then at the appropriate time, call play().

Connectivity


Android Beam

Android Beam™ now supports large payload transfers over Bluetooth. When you define the data to transfer with either the new setBeamPushUris() method or the new callback interface NfcAdapter.CreateBeamUrisCallback, Android hands off the data transfer to Bluetooth or another alternate transport to achieve faster transfer speeds. This is especially useful for large payloads such as image and audio files and requires no visible pairing between the devices. No additional work is required by your app to take advantage of transfers over Bluetooth.
The setBeamPushUris() method takes an array of Uri objects that specify the data you want to transfer from your app. Alternatively, you can implement the NfcAdapter.CreateBeamUrisCallback interface, which you can specify for your activity by calling setBeamPushUrisCallback().
When using the callback interface, the system calls the interface's createBeamUris() method when the user executes a share with Android Beam so that you can define the URIs to share at share-time. This is useful if the URIs to share might vary depending on the user context within the activity, whereas calling setBeamPushUris() is useful when the URIs to share are unchanging and you can safely define them ahead of time.

Network service discovery

Android 4.1 adds support for multicast DNS-based service discovery, which allows you to find and connect to services offered by peer devices over Wi-Fi, such as mobile devices, printers, cameras, media players, and others that are registered on the local network.
The new package android.net.nsd contains the new APIs that allow you to broadcast your services on the local network, discover local devices on the network, and connect to devices.
To register your service, you must first create an NsdServiceInfo object and define the various properties of your service with methods such as setServiceName()setServiceType(), and setPort().
Then you need to implement NsdManager.RegistrationListener and pass it to registerService() with yourNsdServiceInfo.
To discover services on the network, implement NsdManager.DiscoveryListener and pass it to discoverServices().
When your NsdManager.DiscoveryListener receives callbacks about services found, you need to resolve the service by calling resolveService(), passing it an implementation of NsdManager.ResolveListener that receives anNsdServiceInfo object that contains information about the discovered service, allowing you to initiate the connection.

Wi-Fi P2P service discovery

The Wi-Fi P2P APIs are enhanced in Android 4.1 to support pre-association service discovery in the WifiP2pManager. This allows you to discover and filter nearby devices by services using Wi-Fi P2P before connecting to one, while Network Service Discovery allows you to discover a service on an existing connected network (such as a local Wi-Fi network).
To broadcast your app as a service over Wi-Fi so that other devices can discover your app and connect to it, calladdLocalService() with a WifiP2pServiceInfo object that describes your app services.
To initiate discover of nearby devices over Wi-Fi, you need to first decide whether you'll communicate using Bonjour or Upnp. To use Bonjour, first set up some callback listeners with setDnsSdResponseListeners(), which takes both aWifiP2pManager.DnsSdServiceResponseListener and WifiP2pManager.DnsSdTxtRecordListener. To use Upnp, callsetUpnpServiceResponseListener(), which takes a WifiP2pManager.UpnpServiceResponseListener.
Before you can start discovering services on local devices, you also need to call addServiceRequest(). When theWifiP2pManager.ActionListener you pass to this method receives a successful callback, you can then begin discovering services on local devices by calling discoverServices().
When local services are discovered, you'll receive a callback to either theWifiP2pManager.DnsSdServiceResponseListener or WifiP2pManager.UpnpServiceResponseListener, depending on whether you registered to use Bonjour or Upnp. The callback received in either case contains a WifiP2pDevice object representing the peer device.

Network usage

The new method isActiveNetworkMetered() allows you to check whether the device is currently connected to a metered network. By checking this state before performing intensive network transactions, you can help manage the data usage that may cost your users money and make informed decisions about whether to perform the transactions now or later (such as when the device becomes connected to Wi-Fi).

Accessibility


Accessibility service APIs

The reach of accessibility service APIs has been significantly increased in Android 4.1. It now allows you to build services that monitor and respond to more input events, such as complex gestures using onGesture() and other input events through additions to the AccessibilityEventAccessibilityNodeInfo and AccessibilityRecord classes.
Accessibility services can also perform actions on behalf of the user, including clicking, scrolling and stepping through text using performAction and setMovementGranularities. The performGlobalAction() method also allows services to perform actions such as Back, Home, and open Recent Apps and Notifications.

Customizable app navigation

When building an Android app, you can now customize navigation schemes by finding focusable elements and input widgets using findFocus() and focusSearch(), and set focus using setAccessibilityFocused().

More accessible widgets

The new android.view.accessibility.AccessibilityNodeProvider class allows you to surface complex custom views to accessibility services so they can present the information in a more accessible way. Theandroid.view.accessibility.AccessibilityNodeProvider allows a user widget with advanced content, such as a calendar grid, to present a logical semantic structure for accessibility services that is completely separate from the widget’s layout structure. This semantic structure allows accessibility services to present a more useful interaction model for users who are visually impaired.

Copy and Paste


Copy and paste with intents

You can now associate a ClipData object with an Intent using the setClipData() method. This is especially useful when using an intent to transfer multiple content: URIs to another application, such as when sharing multiple documents. The content: URIs supplied this way will also respect the intent's flags to offer read or write access, allowing you to grant access to multiple URIs in an the intent. When starting an ACTION_SEND or ACTION_SEND_MULTIPLEintent, the URIs supplied in the intent are now automatically propagated to the ClipData so that the receiver can have access granted to them.
Support for HTML and string styles
The ClipData class now supports styled text (either as HTML or Android styled strings). You can add HTML styled text to the ClipData with newHtmlText().

Renderscript


Renderscript computation functionality has been enhanced with the following features:
  • Support for multiple kernels within one script.
  • Support for reading from allocation with filtered samplers from compute in a new script API rsSample.
  • Support for different levels of FP precision in #pragma.
  • Support for querying additional information from RS objects from a compute script.
  • Numerous performance improvements.
New pragmas are also available to define the floating point precision required by your compute Renderscripts. This lets you enable NEON like operations such as fast vector math operations on the CPU path that wouldn’t otherwise be possible with full IEEE 754-2008 standard.
Note: The experimental Renderscript graphics engine is now deprecated.

Animation


Activity launch animations

You can now launch an Activity using zoom animations or your own custom animations. To specify the animation you want, use the ActivityOptions APIs to build a Bundle that you can then pass to any of the methods that start an activity, such as startActivity().
The ActivityOptions class includes a different method for each type of animation you may want to show as your activity opens:
makeScaleUpAnimation()
Creates an animation that scales up the activity window from a specified starting position on the screen and a specified starting size. For example, the home screen in Android 4.1 uses this when opening an app.
makeThumbnailScaleUpAnimation()
Creates an animation that scales up the activity window starting from a specified position and a provided thumbnail image. For example, the Recent Apps window in Android 4.1 uses this when returning to an app.
makeCustomAnimation()
Creates an animation defined by your own resources: one that defines the animation for the activity opening and another for the activity being stopped.

Time animator

The new TimeAnimator provides a simple callback mechanism with the TimeAnimator.TimeListener that notifies you upon every frame of the animation. There is no duration, interpolation, or object value-setting with this Animator. The listener's callback receives information for each frame including total elapsed time and the elapsed time since the previous animation frame.

User Interface


Notifications

In Android 4.1, you can create notifications with larger content regions, big image previews, multiple action buttons, and configurable priority.
Notification styles
The new method setStyle() allows you to specify one of three new styles for your notification that each offer a larger content region. To specify the style for your large content region, pass setStyle() one of the following objects:
Notification.BigPictureStyle
For notifications that includes a large image attachment.
Notification.BigTextStyle
For notifications that includes a lot of text, such as a single email.
Notification.InboxStyle
For notifications that include a list of strings, such as snippets from multiple emails.
Notification actions
There's now support for up to two action buttons that appear at the bottom of the notification message, whether your notification uses the normal or larger style.
To add an action button, call addAction(). This method takes three arguments: a drawable resource for an icon, text for the button, and a PendingIntent that defines the action to perfrom.
Priorities
You can now hint to the system how important your notification is to affect the order of your notification in the list by setting the priority with setPriority(). You can pass this one of five different priority levels defined by PRIORITY_*constants in the Notification class. The default is PRIORITY_DEFAULT, and there's two levels higher and two levels lower.
High priority notifications are things that users generally want to respond to quickly, such as a new instant message, text message, or impending event reminder. Low priority notifications are things like expired calendar events or app promotions.

Controls for system UI

Android 4.0 (Ice Cream Sandwich) added new flags to control the visibility of the system UI elements, such as to dim the appearance of the system bar or make it disappear completely on handsets. Android 4.1 adds a few more flags that allow you to further control the appearance of system UI elements and your activity layout in relation to them by callingsetSystemUiVisibility() and passing the following flags:
SYSTEM_UI_FLAG_FULLSCREEN
Hides non-critical system UI (such as the status bar). If your activity uses the action bar in overlay mode (by enabling android:windowActionBarOverlay), then this flag also hides the action bar and does so with a coordinated animation when both hiding and showing the two.
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
Sets your activity layout to use the same screen area that's available when you've enabledSYSTEM_UI_FLAG_FULLSCREEN even if the system UI elements are still visible. Although parts of your layout will be overlayed by the system UI, this is useful if your app often hides and shows the system UI withSYSTEM_UI_FLAG_FULLSCREEN, because it avoids your layout from adjusting to the new layout bounds each time the system UI hides or appears.
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
Sets your activity layout to use the same screen area that's available when you've enabledSYSTEM_UI_FLAG_HIDE_NAVIGATION (added in Android 4.0) even if the system UI elements are still visible. Although parts of your layout will be overlayed by the navigation bar, this is useful if your app often hides and shows the navigation bar with SYSTEM_UI_FLAG_HIDE_NAVIGATION, because it avoids your layout from adjusting to the new layout bounds each time the navigation bar hides or appears.
SYSTEM_UI_FLAG_LAYOUT_STABLE
You might want to add this flag if you're using SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and/orSYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION to ensure that when you call fitSystemWindows() on a view that the bounds defined remain consistent with regard to the available screen space. That is, with this flag set,fitSystemWindows() will behave as if the visibility of system UI elements is unchanged even after you hide all system UI.
For more discussion about the other related system UI flags, read about those added in Android 4.0.

Remote views

GridLayout and ViewStub are now remotable views so you can use them in layouts for your app widgets and notification custom layouts.

Font families

Android 4.1 adds several more variants of the Roboto font style for a total of 10 variants, and they're all usable by apps. Your apps now have access to the full set of both light and condensed variants.
The complete set of Roboto font variants available is:
  • Regular
  • Italic
  • Bold
  • Bold-italic
  • Light
  • Light-italic
  • Condensed regular
  • Condensed italic
  • Condensed bold
  • Condensed bold-italic
You can apply any one of these with the new fontFamily attribute in combination with the textStyle attribute.
Supported values for fontFamily are:
  • "sans-serif" for regular Roboto
  • "sans-serif-light" for Roboto Light
  • "sans-serif-condensed" for Roboto Condensed
You can then apply bold and/or italic with textStyle values "bold" and "italic". You can apply both like so:android:textStyle="bold|italic".
You can also use Typeface.create(). For example, Typeface.create("sans-serif-light", Typeface.NORMAL).

Input Framework


Multiple input devices

The new InputManager class allows you to query the set of input devices current connected and register to be notified when a new device is added, changed, or removed. This is particularly useful if you're building a game that supports multiple players and you want to detect how many controllers are connected and when there are changes to the number of controllers.
You can query all input devices connected by calling getInputDeviceIds(). This returns an array of integers, each of which is an ID for a different input device. You can then call getInputDevice() to acquire an InputDevice for a specified input device ID.
If you want to be informed when new input devices are connected, changed, or disconnected, implement theInputManager.InputDeviceListener interface and register it with registerInputDeviceListener().

Vibrate for input controllers

If connected input devices have their own vibrate capabilities, you can now control the vibration of those devices using the existing Vibrator APIs simply by calling getVibrator() on the InputDevice.

Permissions


The following are new permissions:
READ_EXTERNAL_STORAGE
Provides protected read access to external storage. In Android 4.1 by default all applications still have read access. This will be changed in a future release to require that applications explicitly request read access using this permission. If your application already requests write access, it will automatically get read access as well. There is a new developer option to turn on read access restriction, for developers to test their applications against how Android will behave in the future.
android.Manifest.permission.READ_USER_DICTIONARY
Allows an application to read the user dictionary. This should only be required by an IME, or a dictionary editor like the Settings app.
READ_CALL_LOG
Allows an application to read the system's call log that contains information about incoming and outgoing calls.
WRITE_CALL_LOG
Allows an application to modify the system's call log stored on your phone
android.Manifest.permission.WRITE_USER_DICTIONARY
Allows an application to write to the user's word dictionary.

Device Features


Android 4.1 includes a new feature declaration for devices that are dedicated to displaying the user interface on a television screen: FEATURE_TELEVISION. To declare that your app requires a television interface, declare this feature in your manifest file with the <uses-feature> element:
<manifest ... >
    <uses-feature android:name="android.hardware.type.television"
                  android:required="true" />
    ...</manifest>
This feature defines "television" to be a typical living room television experience: displayed on a big screen, where the user is sitting far away and the dominant form of input is be something like a d-pad, and generally not through touch or a mouse/pointer-device.

Portions of this page are reproduced from work created and shared by the Android Open Source Project and used according to terms described in theCreative Commons 2.5 Attribution License.

Original Page Direct link:
http://developer.android.com/about/versions/android-4.1.html