
Android系统中,判断应用是否首次安装,只能在服务器去判断,前台只能判断有无安装,判断有以下方式:
1根据包名判断,以下为判断代码:
public boolean checkApkExist(Context context, String packageName) {
if (packageName == null || “”equals(packageName))
return false;
try {
ApplicationInfo info = contextgetPackageManager()
getApplicationInfo(packageName,
PackageManagerGET_UNINSTALLED_PACKAGES);
return true;
} catch (NameNotFoundException e) {
return false;
}
}
2 根据Intent判断,以下为判断代码:
public boolean checkApkExist(Context context, Intent intent) {
List<ResolveInfo> list = contextgetPackageManager()queryIntentActivities(intent, 0);
if(listsize() > 0){
return true;
}
return false;
}
public boolean checkApkExist(Context context, String packageName) {
if (packageName == null || “”equals(packageName)) return false;
try {
ApplicationInfo info = contextgetPackageManager() getApplicationInfo(packageName, PackageManagerGET_UNINSTALLED_PACKAGES); return true;
} catch (NameNotFoundException e) { return false; }
}
public boolean checkApkExist(Context context, Intent intent) {
List<ResolveInfo> list = contextgetPackageManager()
queryIntentActivities(intent, 0);
if (listsize() > 0) {
return true;
}
return false;
}
以下是APK跳转的代码示例:
/
判断是否安装了另一个APK
@param context
@param packageName 另一个APK包名
@return
/
/
判断是否安装了APK,如果安装,则执行btnOpenMain(),打开,否则btnDownMain()打开下载页面
/
private void packageIn() {
// TODO Auto-generated method stub
if(isAppInstalled(act, packagename)==true){
btnOpenMain(packagename);
}else{
btnDownMain();
}
}
public boolean isAppInstalled(Context context, String packageName) {
final PackageManager packageManager = contextgetPackageManager();
List<PackageInfo> pinfo = packageManagergetInstalledPackages(0);
List<String> pName = new ArrayList<String>();
if (pinfo != null) {
for (int i = 0; i < pinfosize(); i++) {
String pn = pinfoget(i)packageName;
pNameadd(pn);
}
}
return pNamecontains(packageName);
}
/
打开下载APK的页面
/
private void btnDownMain() {
btnDownsetOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uriparse(downUri);
Intent intent = new Intent(IntentACTION_VIEW, uri);
startActivity(intent);
}
});
}
/
打开另一个APK应用页面
/
private void btnOpenMain(final String packagename) {
btnDownsetBackgroundResource(Rdrawableqx_btn_off);
btnDownsetOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startSevenStarApp(packagename);
}
});
}
/
启动另一个APK
/
public void startSevenStarApp(String packageName) {
PackageInfo pi;
try {
pi = getPackageManager()getPackageInfo(packageName, 0);
Intent resolveIntent = new Intent(IntentACTION_MAIN, null);
resolveIntentsetPackage(pipackageName);
PackageManager pManager = getPackageManager();
List apps = pManagerqueryIntentActivities(resolveIntent, 0);
ResolveInfo ri = (ResolveInfo) appsiterator()next();
if (ri != null) {
packageName = riactivityInfopackageName;
String className = riactivityInfoname;
Intent intent = new Intent();
ComponentName cn = new ComponentName(packageName, className);
intentsetComponent(cn);
intentaddFlags(IntentFLAG_ACTIVITY_NEW_TASK);//传递的数据
intentputExtra("clientId", clientId);
intentputExtra("sign", sign);
startActivity(intent);
// finish();
}
} catch (Exception e) {
eprintStackTrace();
}
}
有些时候我们使用Service的时需要采用隐私启动的方式,但是Android 50一出来后,其中有个特性就是Service Intent must be explitict,也就是说从Lollipop开始,service服务必须采用显示方式启动。
而android源码是这样写的(源码位置:sdk/sources/android-21/android/app/ContextImpljava):
private void validateServiceIntent(Intent service) {
if (servicegetComponent() == null && servicegetPackage() == null) {
if (getApplicationInfo()targetSdkVersion >= BuildVERSION_CODESLOLLIPOP) {
IllegalArgumentException ex = new IllegalArgumentException(
"Service Intent must be explicit: " + service);
throw ex;
} else {
Logw(TAG, "Implicit intents with startService are not safe: " + service
+ " " + DebuggetCallers(2, 3));
}
}
}
复制代码
既然,源码里是这样写的,那么这里有两种解决方法:
1、设置Action和packageName:
参考代码如下:
Intent mIntent = new Intent();
mIntentsetAction("XXXXXXXXX");//你定义的service的action
mIntentsetPackage(getPackageName());//这里你需要设置你应用的包名
contextstartService(mIntent);
复制代码
此方式是google官方推荐使用的解决方法。
2、将隐式启动转换为显示启动:
public static Intent getExplicitIntent(Context context, Intent implicitIntent) {
// Retrieve all services that can match the given intent
PackageManager pm = contextgetPackageManager();
List<ResolveInfo> resolveInfo = pmqueryIntentServices(implicitIntent, 0);
// Make sure only one match was found
if (resolveInfo == null || resolveInfosize() != 1) {
return null;
}
// Get component info and create ComponentName
ResolveInfo serviceInfo = resolveInfoget(0);
String packageName = serviceInfoserviceInfopackageName;
String className = serviceInfoserviceInfoname;
ComponentName component = new ComponentName(packageName, className);
// Create a new intent Use the old one for extras and such reuse
Intent explicitIntent = new Intent(implicitIntent);
// Set the component to be explicit
explicitIntentsetComponent(component);
return explicitIntent;
}
复制代码
调用方式如下:
Intent mIntent = new Intent();
mIntentsetAction("XXXXXXXXX");
Intent eintent = new Intent(getExplicitIntent(mContext,mIntent));
contextstartService(eintent);
以上就是关于安卓 如何判断应用是首次安装全部的内容,包括:安卓 如何判断应用是首次安装、Android中从一个APK跳转到另一个APK的指定页面、如何解决android 5.0中出现的警告service intent must be expl等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)