-
(1)启动应用,开启服务,在服务里进行耗时操作 ✔
-
(2)广播得到所有apk的应用,展示在recyclerView上面 ✔
-
(3)搜索按钮的实现:用searchView+RecyclerView ✳
-
-
注意点:
-
1.service要在manifest里面进行声明
-
2.获取到的app的Icon是drawable对象,databean的imageid要用drawable 类型字段
-
3.imageView.setImageDrawable(Drawable drawable)
-
4.更新完数据别忘了notifyDataSetChange
效果预览:


源码:
mainActivity
/**
* (1)启动应用,开启服务,在服务里进行耗时操作 ✔
* (2)广播得到所有apk的应用,展示在recyclerView上面 ✔
* (3)搜索按钮的实现:用searchView+RecyclerView ✳
*
* <p>
* 注意点:
* 1.service要在manifest里面进行声明
* 2.获取到的app的Icon是drawable对象,databean的imageid要用drawable 类型字段
* 3.imageView.setImageDrawable(Drawable drawable)
* 4.更新完数据别忘了notifyDataSetChange
*/
public class MainActivity extends AppCompatActivity {
private SearchView searchView;
private RecyclerView recyclerView;
private List<DataBean> mDatas = new ArrayList<>();
private MyAdapter myAdapter;
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//todo:通过IBinder获取数据源
MyService.MyBinder myBinder = (MyService.MyBinder) service;
List<DataBean> data = myBinder.getData();
mDatas.clear();
mDatas.addAll(data);
myAdapter.notifyDataSetChanged();
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
searchView = findViewById(R.id.editText);
recyclerView = findViewById(R.id.rv);
//绑定服务获取数据源
Intent intent = new Intent(this, MyService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
//设置adapter
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
myAdapter = new MyAdapter(this, mDatas);
recyclerView.setAdapter(myAdapter);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (TextUtils.isEmpty(newText)) {
myAdapter.setDatas(mDatas);
myAdapter.notifyDataSetChanged();
} else {
myAdapter.setDatas(search(newText));
myAdapter.notifyDataSetChanged();
}
return false;
}
});
}
private List<DataBean> search(String query) {
List<DataBean> filterDatas = new ArrayList<>();
for (DataBean source : mDatas) {
if (source.getAppName().contains(query)) {
filterDatas.add(source);
}
}
return filterDatas;
}
}
myApplication
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//开启服务
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
}
myService
public class MyService extends Service {
List<DataBean> dataBeans = new ArrayList<>();
@Override
public void onCreate() {
super.onCreate();
//todo: 广播获取
PackageManager packageManager = this.getPackageManager();
List<PackageInfo> infos = packageManager.getInstalledPackages
(PackageManager.GET_ACTIVITIES);
dataBeans.clear();
for (int i = 0; i < infos.size(); i++) {
PackageInfo packageInfo = infos.get(i);
//拿到应用程序的信息
ApplicationInfo appInfo = packageInfo.applicationInfo;
//拿到应用程序的程序名
String appName = packageManager.getApplicationLabel(appInfo).toString();
// Log.d("TAG", "onCreate: "+"----"+appName);
//拿到应用程序的图标
Drawable icon = packageManager.getApplicationIcon(appInfo);
DataBean dataBean = new DataBean(icon, appName);
dataBeans.add(dataBean);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
class MyBinder extends Binder {
public List<DataBean> getData() {
// Log.d("TAG", "getData: "+dataBeans.size());
return dataBeans;
}
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
myAdapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
Context context;
List<DataBean> mDatas;
public void setDatas(List<DataBean> datas) {
mDatas = datas;
}
public MyAdapter(Context context, List<DataBean> mDatas) {
this.context = context;
this.mDatas = mDatas;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Drawable icon = mDatas.get(position).getImageId();
holder.imageView.setImageDrawable(icon);
String appName = mDatas.get(position).getAppName();
holder.textView.setText(appName);
}
@Override
public int getItemCount() {
return mDatas.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageView;
TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.item_iv);
textView = itemView.findViewById(R.id.item_name);
}
}
}
dataBean
public class DataBean {
Drawable imageId;
String appName;
public DataBean() {
}
public DataBean(Drawable imageId, String appName) {
this.imageId = imageId;
this.appName = appName;
}
public Drawable getImageId() {
return imageId;
}
public void setImageId(Drawable imageId) {
this.imageId = imageId;
}
public String getAppName() {
return appName;
}
public void setAppName(String appName) {
this.appName = appName;
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<SearchView
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:focusable="true"
android:maxLines="1"
android:queryHint="您要搜索哪些应用?" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:padding="10dp">
<ImageView
android:id="@+id/item_iv"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/search" />
<TextView
android:id="@+id/item_name"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_alignBottom="@id/item_iv"
android:layout_toRightOf="@id/item_iv"
android:gravity="center_vertical"
android:padding="5dp"
android:text="com.apk.apk"
android:textSize="20sp" />
</RelativeLayout>
本文介绍了一个基于Android的应用搜索和展示项目。项目使用了Service进行耗时操作,并通过Broadcast接收安装的所有apk信息,最终将应用名称及图标显示在RecyclerView中。此外,还实现了通过SearchView搜索应用的功能。
&spm=1001.2101.3001.5002&articleId=110739584&d=1&t=3&u=449779ea59d34bce9fb3bdc1cff8d684)

被折叠的 条评论
为什么被折叠?



