我需要一个简单的家庭Widget来启动外部应用程序(例如:whatsapp) .
在我的MainActivity扩展AppWidgetProvider(onUpdate)中,我使用此代码创建待定意图,并且如果安装了App,则工作得很好 .
Intent intent = new Intent();
ComponentName cn = new ComponentName("com.whatsapp", "com.whatsapp.Main");
intent.setComponent(cn);
PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main);
views.setOnClickPendingIntent(R.id.imageView, pending);
appWidgetManager.updateAppWidget(currentWidgetId, views);
在(onReceive)部分,我使用此代码检测是否安装了应用程序
PackageManager pm = context.getPackageManager();
List<ApplicationInfo> list = pm.getInstalledApplications(0);
for (int aa = 0; aa < list.size(); aa++) {
if(list.get(aa).packageName.equals("com.whatsapp")){
//app istalled
noapp = 0;
}
else{
//app not istalled
noapp1 = 1;
}
}
if(noapp1==1){
Toast.makeText(context, "Whatsapp not installed", Toast.LENGTH_SHORT).show();
}
我的问题是:此代码检测是否未安装应用程序并显示Toast消息,但仅在小部件第一次位于主页时 . 如果未安装App,我需要在触摸imageview的任何时候显示消息 . 请帮忙!
Karakuri我试着应用你的建议 . 这是我在主要活动中的代码,用于将意图附加到imageView:
public class MainActivity extends AppWidgetProvider{
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
for(int i=0; i<appWidgetIds.length; i++){
int currentWidgetId = appWidgetIds[i];
Intent intent = new Intent(LaunchExternalAppReceiver.ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.activity_main);
views.setOnClickPendingIntent(R.id.imageView, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current App Widget
appWidgetManager.updateAppWidget(currentWidgetId, views);
}
}
}
这是带有BroadcastReceiver的新类(我在我的simpele代码里面检查是否安装了App,只是为了测试):
public class LaunchExternalAppReceiver extends BroadcastReceiver {
public static final String ACTION = "control";
@Override
public void onReceive(Context context, Intent intent) {
PackageManager pm = context.getPackageManager();
List<ApplicationInfo> list = pm.getInstalledApplications(0);
for (int aa = 0; aa < list.size(); aa++) {
if(list.get(aa).packageName.equals("com.whatsapp")){
//app istalled
}
else{
//app not istalled
Toast.makeText(context, "Whatsapp not installed", Toast.LENGTH_SHORT).show();
}
}
}
}
这是我的清单:
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="19" /><application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name=".MainActivity" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/mywidget" />
</receiver>
<receiver android:name=".LaunchExternalAppReceiver" >
<intent-filter>
<action android:name="control" >
</action>
</intent-filter>
</receiver>
</application>
非常感谢你的帮助 .
2 回答
让ImageView单击将广播发送到应用程序中的接收器(使用PendingIntent.getBroadcast()) . 在该接收器中,您可以检查是否已安装外部应用程序并从那里启动它 .
EDIT
制作一个新的BroadcastReceiver .
将其添加到您的AndroidManifest . 确保intent filter操作符合上面的ACTION .
使ImageView使用此操作发送广播,而不是尝试启动外部应用 .
我找到了另一种解决方案 . 工作迎接,但有一个恼人的小问题 . 我在我的主要活动中附加了一个意图到imageView,在这个类中启动一个新的类“控件”我检查是否安装了应用程序并启动她或发送消息并提供下载按钮 . 问题是......如果安装了应用程序,控制类会启动她,但是在App打开之前会出现一秒钟的活动(控制)屏幕 . 很烦人 . 有人可以帮我做最后的修复吗?谢谢 .
在onUpdate(主要活动):
我的新 class (控制):