android 添加桌面快捷方式
、在桌面创建快捷方式方法:
方法一:通过长按某一个应用程序的图标在桌面上创建启动该应用程序的快捷方式。
这个方法安装完程序都用户都能实现。
方法二:在应用程序中构建一个Intent,然后以Broadcast的形式通知Launcher创建快捷方式。
先看Launcher的AndroidMainfest.xml文件中InstallShortcutReceiver的注册信息:
- <!--设置wallpapaer的activity -->
- <!-- Intent received used to install shortcuts from other applications -->
- <receiver
- android:name="com.android.launcher2.InstallShortcutReceiver"
- android:permission="com.android.launcher.permission.INSTALL_SHORTCUT">
- <intent-filter>
- <action android:name="com.android.launcher.action.INSTALL_SHORTCUT" />
- </intent-filter>
- </receiver>
<!--设置wallpapaer的activity --> <!-- Intent received used to install shortcuts from other applications --> <receiver android:name="com.android.launcher2.InstallShortcutReceiver" android:permission="com.android.launcher.permission.INSTALL_SHORTCUT"> <intent-filter> <action android:name="com.android.launcher.action.INSTALL_SHORTCUT" /> </intent-filter> </receiver>
所以向这个BroadcastReceiver发送广播,首先应用程序必须要 有com.android.launcher.permission.INSTALL_SHORTCUT权限,然后广播去的Intent的action设置为
com.android.launcher.action.INSTALL_SHORTCUT。
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.studio.android.ch10.ex1"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/ji" android:label="@string/app_name">
- <activity android:name=".UrgentCall"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="3" />
- <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
- </manifest>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.studio.android.ch10.ex1" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/ji" android:label="@string/app_name"> <activity android:name=".UrgentCall" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> </manifest>
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Parcelable;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- public class UrgentCall extends Activity implements
- OnClickListener {
- Button police;
- Button fire;
- Intent directCall;
- private final String ACTION_ADD_SHORTCUT =
- "com.android.launcher.action.INSTALL_SHORTCUT";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- police = (Button)findViewById(R.id.police);
- fire = (Button)findViewById(R.id.firepolice);
- police.setOnClickListener(this);
- fire.setOnClickListener(this);
- directCall = new Intent(Intent.ACTION_CALL);
- }
- @Override
- public void onClick(View v) {
- Intent addShortcut =
- new Intent(ACTION_ADD_SHORTCUT);
- String numToDial = null;
- Parcelable icon = null;
- switch (v.getId()) {
- case R.id.police:
- numToDial = "110";
- icon = Intent.ShortcutIconResource.fromContext(
- this,R.drawable.jing);
- break;
- case R.id.firepolice:
- numToDial = "119";
- icon = Intent.ShortcutIconResource.fromContext(
- this,R.drawable.huo);
- break;
- default:
- break;
- }
- addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,
- numToDial);
- directCall.setData(Uri.parse("tel://"+numToDial));
- addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,
- directCall);
- addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
- icon);
- sendBroadcast(addShortcut);
- }
- }
import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class UrgentCall extends Activity implements OnClickListener { Button police; Button fire; Intent directCall; private final String ACTION_ADD_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); police = (Button)findViewById(R.id.police); fire = (Button)findViewById(R.id.firepolice); police.setOnClickListener(this); fire.setOnClickListener(this); directCall = new Intent(Intent.ACTION_CALL); } @Override public void onClick(View v) { Intent addShortcut = new Intent(ACTION_ADD_SHORTCUT); String numToDial = null; Parcelable icon = null; switch (v.getId()) { case R.id.police: numToDial = "110"; icon = Intent.ShortcutIconResource.fromContext( this,R.drawable.jing); break; case R.id.firepolice: numToDial = "119"; icon = Intent.ShortcutIconResource.fromContext( this,R.drawable.huo); break; default: break; } addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, numToDial); directCall.setData(Uri.parse("tel://"+numToDial)); addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, directCall); addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); sendBroadcast(addShortcut); } }
方法三:为应用程序组件注册一个符合特定条件的IntentFilter,然后就可以直接在Launcher的桌面上添加启动该组件的快捷方式了。
当我们在Home应用程序Launcher的桌面空白处长按触摸时,会出现一个对话框,提示选择要添加的桌面组件。当我们想把添加的快捷方式的Activity添加进这列时,只需要在这个Activity注册时添加一个Action为android.intent.action.CREATE_SHORTCUT的IntentFilter就可以。
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.studio.android.ch10.ex1"
- android:versionCode="1"
- android:versionName="1.0">
- <application android:icon="@drawable/ji" android:label="@string/app_name">
- <activity android:name=".UrgentCall"
- android:label="@string/app_name">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- </intent-filter>
- </activity>
- <activity android:name=".FireShortcut">
- <intent-filter>
- <action android:name="android.intent.action.CREATE_SHORTCUT" />
- </intent-filter>
- </activity>
- </application>
- <uses-sdk android:minSdkVersion="3" />
- <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
- </manifest>
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.studio.android.ch10.ex1" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/ji" android:label="@string/app_name"> <activity android:name=".UrgentCall" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> </intent-filter> </activity> <activity android:name=".FireShortcut"> <intent-filter> <action android:name="android.intent.action.CREATE_SHORTCUT" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/> </manifest>
- import android.app.Activity;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Parcelable;
- public class FireShortcut extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Intent addShortcut;
- //若是“添加快捷方式”的Action就初始化快捷方式的Intent
- if (getIntent().getAction()
- .equals(Intent.ACTION_CREATE_SHORTCUT)) {
- /*初始化添加快捷图标的Intent*/
- addShortcut = new Intent();
- addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,
- "119");
- Parcelable icon = Intent.ShortcutIconResource.fromContext(
- this,R.drawable.huo);
- addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,
- icon);
- Intent callFirePolice =
- new Intent(Intent.ACTION_CALL,Uri.parse("tel://119"));
- addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT,
- callFirePolice);
- /*设置Result*/
- //因为Action是由Launcher通过startActivityForResult这个方法发出的。
- setResult(RESULT_OK,addShortcut);
- } else {
- setResult(RESULT_CANCELED);
- }
- finish();
- }
- }
import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Parcelable; public class FireShortcut extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent addShortcut; //若是“添加快捷方式”的Action就初始化快捷方式的Intent if (getIntent().getAction() .equals(Intent.ACTION_CREATE_SHORTCUT)) { /*初始化添加快捷图标的Intent*/ addShortcut = new Intent(); addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "119"); Parcelable icon = Intent.ShortcutIconResource.fromContext( this,R.drawable.huo); addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); Intent callFirePolice = new Intent(Intent.ACTION_CALL,Uri.parse("tel://119")); addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, callFirePolice); /*设置Result*/ //因为Action是由Launcher通过startActivityForResult这个方法发出的。 setResult(RESULT_OK,addShortcut); } else { setResult(RESULT_CANCELED); } finish(); } }
这时列表中会有两个UrgentCall的选项,第二个就直接在桌面添加“拨打火警119”的快捷方式了。