安卓 如何判断应用是首次安装

安卓 如何判断应用是首次安装,第1张

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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9462476.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存