Visualizzazione post con etichetta code. Mostra tutti i post
Visualizzazione post con etichetta code. Mostra tutti i post

03 giugno 2013

Android development: shortcut vs widget part 2

Second part of post "Android development: shortcut vs widget", the code.

As from previous post the necessary steps to create a shortcut that user can add to his home screen are 3:
  • create the activity launched when the user adds the shortcut
  • add the previous activity to manifest.xml
  • write the code for previous activity

1. create the activity launched when the user adds the shortcut
This is the simplest task, you have only to create a class that exend Activity, in my case the acticity name is Widget1LabelShortcut.

2. add the previous activity to manifest.xml
You have to add the previous activity Widget1LabelShortcut to manifest.xml. It is a normal activity with an intent-filter as the following code.
Be careful, the shortcut will appear in the list of widgets (or shortcuts depending on the Android version ) with the application name as label . If you want to display a custom name you must add the field label in the manifest, as in the example below. This can be useful for the user to understand what the shortcut makes and if you create multiple shortcuts to avoid confusion.

<activity 
  android:name="com.crbin1.labeltodo.Widget1LabelShortcut"  
  android:configChanges="keyboardHidden|orientation|screenSize"
  android:label="Label shortcut">
  <intent-filter>
    <action android:name="android.intent.action.CREATE_SHORTCUT"/>
    <category android:name="android.intent.category.DEFAULT"/>
  </intent-filter> 
</activity>

3. write the code for activity Widget1LabelShortcut
And now the Activity code to create the shortcut.
In the simplest case this activity is invisible to the user and it only serves to create the shortcut, all the code will be in the method onCreate.
In other cases the activity can have its own ContentView, a layout and respond to user interaction that can customize the shortcut.
The code below with comments should be self explanatory.


  @Override
  protected void onCreate(Bundle savedInstanceState) {
    // You have to create 2 Intents
    
    // Intent #1.  It is the intent that will launch your targer Activity 
    // when user will click the shortcut.
    Intent shortcutIntent = new Intent(this, ActivityTarget.class);
    // You can use this intent to pass parameters to target activity
    // in my app the label id for example
    long labelId; // [...] code to retrieve labelId
    shortcutIntent.putExtra("tid", labelId);
    // Or to set flags
    shortcutIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    shortcutIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
    // Intent #2.  It is the intent used to create shortcut.
    Intent intent = new Intent();
    // This intent must have:
    // --- the previous shortcut intent
    intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
    // --- a name showed in home screen
    String name; // [...] code to retrieve name
    intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);
    // --- an icon showed in home screen
    ShortcutIconResource ir = 
        Intent.ShortcutIconResource.fromContext(this, R.drawable.w1);
        intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, ir);
        
        // that's all, now you need to set shortcut and finish activity
        setResult(RESULT_OK, intent);
        finish();

    super.onCreate(savedInstanceState);
  }

31 maggio 2013

Android development: shortcut vs widget

In the next version of LabelToDo there will be the first widget, an icon 1x1 that allows user to launch a "non-launcher activity" of the application. In particular widget launches the activity of Tasks, displaying only the tasks with the label that the user has chosen when he created the widget.

I raised the issue of how to do the widget, initially planning to build a "real widget". Many applications use this solution, but I soon realized that it is not the best solution.

How explained here from an Android framework engineer "Widgets should look like widgets, not like shortcuts". Here is the solution, create a shortcut and not a widget, moreover in the latest versions of the Android shortcuts appear in the same menu of widgets and they are widgets for users.

What are the advantages of a shortcut than a widget to create an icon 1x1 that launches an activity?

- Efficiency, a shortcut does the shortcut job better than a widget
- Graphics, the shortcut has its label and its icon and aligns with the other icons on the home better than a widget that has to be adapted and normally has no label
- Writing code, it is not necessary to adjust the widget, shortcut's code is quiet simple

After this long introduction let's see how to create a shortcut that:
- the user can add to the home screen
- launches an activity
- passes parameters to launched activity

The necessary steps are:
1. create the activity launched when the user adds the shortcut
2. add the previous activity to manifest.xml
3. write the code of the previous activity, in the simplest case activity is invisible to the user, it just serves to create a shortcut. There are cases, like mine, in which the activity requires instead an interaction with user to configure the shortcut before creating it

In each case the activity will:
a. create the intent that will launch the target activity on shortcut clic
b. create another intent that do the shortcut
c. add to previous intent the shortcut's description and icon

All the way here to the theory, in the next post we will see a little code.