zoukankan      html  css  js  c++  java
  • Android开发之Shortcuts, LiveFolder, Widget

    2013-07-05

    桌面组件包括:快捷方式(Shortcuts),实时文件夹(Live Folder),桌面插件(Widget)。

     

    快捷方式用于启动应用程序的某个组件,例如Activity, Service等。

    在桌面上添加快捷方式:长按桌面(或点击MENU->ADD按键)就可以弹出添加桌面组件的选项对话框。

     

    在代码中将应用程序添加到Shortcuts列表中

    在AndroidManifest.xml文件中注册Activity时添加android.intent.action.CREATE_SHORTCUT的IntentFilter,然后在Shortcuts列表中就会出现该应用的图标和名字了。

    为快捷方式设置名字,图标,事件等

    在Activity的onCreate方法中

    public void onCreate(Bundle savedInstanceState) {

    // 判断该Activity是否要允许添加快捷方式

    if(getIntent().getAction().equals(Intent.ACTION_CREATE_SHORTCUT)) {

      Intent it = new Intent();

      // 设置名字

      it.putExtra(Intent.EXTRA_SHORTCUT_NAME, “发生邮件”);

      // 设置图标,使用系统的图标

      Parcelable icon = Intent.ShortcutIconResource.fromContext(this, R.drawable.mail_edit);

      it.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);

      // 设置事件

      Intent mailIt = new Intent(Intent.ACTION_SENDTO, Uri.parse(“mailto:xxx@xxx.com”));

      it.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mailIt);

      setResult(RESULT_OK, it);

    } else {

      setResult(RESULT_CANCELED);

    }

    finish();

    }

     

    实时文件夹(Live Folder)是一个查看你的手机中所有电子书,电子邮件,RSS订阅,播放列表的快捷方式,并且这些内容都是实时更新的。

    LiveFolder本身不存储任何信息,都是以映射的方式查看ContentProvider所指向的数据信息,并可以自定义显示格式,所以当源数据发生变化时,LiveFolder可以实时更新显示。

    在开发时,我们要保证指定数据的URI的ContentProvider支持LiveFolder的查询。

    通过LiveFolder调用电话薄的联系人,点击其中一条数据时,便执行呼叫该联系人的动作。

    首先在Activity注册时添加Action为android.intent.action.ACTION_CREATE_LIVE_FOLDER的IntentFilter。

    然后我们要在代码中设置LiveFolder的数据源,图标,名字等信息,可以通过intent.setData方法来设置。

    在onCreate方法中实现

    public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      if(getIntent().getAction.equals(LiveFolders.ACTION_CREATE_LIVE_FOLDER)) {

        Intent it = new Intent();

        // 设置数据

        it.setData(Uri.parse(“content://contacts/live_folders/people”));

        // 设置单击事件

        it.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_BASE_INTENT, new Intent(Intent.ACTION_CALL, Contacts.People.CONTENT_URI));

        // 设置名字

        it.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_NAME, “电话薄”);

        // 设置图标

        it.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_ICON, Intent.ShortcutIconResource.fromContext(this, R.drawable.contacts));

        // 设置显示模式

        it.putExtra(LiveFolders.EXTRA_LIVE_FOLDER_DISPLAY_MODE, LiveFolders.DISPLAY_MODE_LIST);

        setResult(RESULT_OK, it);

      } else {

        setResult(RESULT_CANCELED);

      }

      finish();

    }

     

    Widget开发

    Widget是一种很小的应用程序,主要作为Web2.0服务或互联网内容的前端。当Widget被拖到桌面上时,指定一个保留的空间来显示应用提供的自定义内容。用户可以通过这个Widget来和应用交互,例如暂停或切换歌曲。

    每个Widget就是一个BroadcastReceiver,它们用XML metadata来描述Widget的细节。AppWidget Framework通过Broadcast intents和Widget通信,Widget的更新使用RemoteViews来发送。RemoteViews被包装成一个layout和特定内容显示到桌面上。

    开发Widget步骤:

    1. 创建布局文件res/layout/appwidget_provider.xml,用来显示桌面布局。

     

    2. 创建一个描述Widget属性的文件res/xml/xmlappwidget_provider.xml。

    在这个文件中,只有一个标签:<appwidget-provider />

    属性说明:

    android:minWidth, android:minHeight分别指定Widghet的最小宽度和最小高度。

    android:updatePeriodMillis是自动更新的时间间隔。

    android:initialLayout是Widget的布局描述文件。

    android:configure是可选的,在启动Widget启动之前启动。

     

    3. 创建一个继承自AppWidgetProvider的子类。

    在AppWidgetProvider提供几个方法:

    onUpdate, onDeleted, onEnabled, onDisabled

    public class TxrjAppWidgetProvider extends AppWidgetProvider {

      public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        final int n = appWidgetIds.length;

        for(int i=0; i<n; i++) {

          updateAppWidget(context, appWidgetManager, appWidgetId, titlePrefix);

        }

      }

      public void onDeleted(Context context, int[] appWidgetIds) {

        final int n = appWidgetIds.length;

        for(int i=0; i<n; i++) { }

      }

      // 第一个Widget创建时调用

      public void onEnabled(Context context) {

        PackageManager packageManager = context.getPackageManager();

        packageManager.setComponentEnabledSetting(new ComponentName(“xxx”), “.TxrjBoradcastReceiver”,

                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

      }

      // 最后一个Widget创建时调用

      public void onDisabled(Context context) {

        PackageManager pm = context.getPackageManager();

        packageManager.setComponentEnabledSetting(new ComponentName(“xxx”), “.TxrjReceiver”,

                        PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

      }

      // 在updateAppWidget方法中,我们构建了一个RemoteViews对象来对Widget进行更新,

      // setTextViewText用来更新一个TextView的内容

      // updateAppWidget提供给AppWidget使其更新到桌面

      public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, String titlePrefix) {

        RemoteViews views = new RemoteViews(context.getPackagetName, R.layout.appwidget_provider);

        views.setTextViewText(R.id.appwidget_text, titlePrefix);

        appWidgetManager.updateAppWidget(appWidgetId, views);

      }

    }

     

    4. 创建一个BroadcastReceiver来接收更新的信息,收到更新的信息之后就更新Widget。

    public class TxrjBoradcastReceiver extends BroadcastReceiver {

      public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        if(action.equals(Intent.ACTION_TIMEZONE_CHANGED) || action.equals(Intent.ACTION_TIME_CHANGED)) {

          AppWidgetManager widgetManger = AppWidgetManager.getInstance(context);

          ArrayList<Integer> appWidgetIds = new ArrayList<Integer>();

          ArrayList<String> texts = new ArrayList<String>();

          // loadAllTitleTitlePrefs(context, appWidgetIds, texts);

        }

      }

    }

     

    5. 处理android:configure设定的Activity。当点击按钮之后,创建一个AppWidgetManager实例,然后调用TxrjAppWidgetManager.updateAppWidget方法来更新Widget。

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

     

    6. 在AndroidManifest.xml文件中注册Widget, BroadcastReceiver, Activity

    // 注册Widget

    <receiver android:name=”.widget.TxrjAppWidgetProvider”>

      <meta-data android:name=”android.appwidget.provider” android:resource=”@xml/appwidget_provider” />

      <intent-filter>

        <action android:name=”android.appwidget.action.APPWIDGET_UPDATE” />

      </intent-filter>

    </receiver>

    // 注册BroadCastReceiver

    <receiver android:name=”.receiver.TxrjAppWidgetProvider” android:enabled=”false”>

      <intent-filter>

        <action android:name=”android.intent.ACTION_TIMEZONE_CHANGED” />

        <action android:name=”android.intent.ACTION_TIME_CHANGED” />

      </intent-filter>

    </receiver>

    // 注册Activity

    <activity android:name=”.activity.TxrjActivity”>

      <intent-filter>

        <action android:name=”android.appwidget.action.APPWIDGET_CONFIGURE” />

      </intent-filter>

    </activity>

  • 相关阅读:
    mybatis源码追踪2——将结果集映射为map
    Mybatis的cache
    mybatis拦截器
    mybatis中单个参数的引用
    mybatis源码追踪1——Mapper方法用法解析
    win8 下 intellij idea 13 中文输入覆盖的问题
    firebug中html显示为灰色的原因总结
    extjs4.0以上添加多行工具栏的方法
    去除eclipse的validating
    An interview question from MicroStrategy
  • 原文地址:https://www.cnblogs.com/fengzhblog/p/3172963.html
Copyright © 2011-2022 走看看