2016-11-20 141 views
0

我正在開發一個應用程序,它顯示所有安裝的應用程序給用戶與複選框。我成功地這樣做了。但我在保存和檢索用戶選擇的應用程序時遇到問題。我已經使用ArrayList來存儲選定的應用程序,它工作正常,但是當應用程序關閉時,ArrayList中的所有項目都會被刪除。然後我通過SharedPreferences切換到存儲,但我沒有工作。最後一個選擇是通過SQLite數據庫存儲和檢索applicationInfo對象,但是我不知道如何在數據庫中插入和檢索ApplicationInfo對象。 下面是我的代碼(通過ArrayList中存儲):如何在SQLite數據庫中存儲和檢索ApplicationInfo對象?

main_activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    tools:context="com.example.pc.fkidshell.Teen3Activity"> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1"/> 
    <Button 
     android:id="@+id/btn_add" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:layout_marginBottom="20dp" 
     android:text="Add Selected Apps" 
     android:width="170dp" 
     android:layout_alignParentBottom="true" 
     android:layout_gravity="center_horizontal" /> 

</LinearLayout> 

row.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" android:layout_width="fill_parent" 
    android:layout_height="match_parent"> 
    <ImageView 
     android:id="@+id/app_icon" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:padding="3dp" 
     android:scaleType="centerCrop" /> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:gravity="center_vertical" 
     android:orientation="vertical" 
     android:paddingLeft="5dp" > 

     <TextView 
      android:id="@+id/app_name" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center_vertical" 
      android:textStyle="bold" /> 

     <TextView 
      android:id="@+id/app_paackage" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center_vertical" /> 
    </LinearLayout> 

    <CheckBox 
     android:id="@+id/cb_app" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

main_activity.java:

public class Teen3Activity extends ListActivity { 
     private PackageManager packageManager = null; 
     private List<ApplicationInfo> applist = null; 
     private ApplicationAdapter listadaptor = null; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_teen3); 

      Button btn1=(Button) findViewById(R.id.btn_add); 
      btn1.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) 
       { 

        if(MyAddedapss.getAdded_apps().isEmpty()) 
        { 
         Toast.makeText(getApplicationContext(), "Nothing to ADD!", Toast.LENGTH_LONG).show(); 
        } 
        else 
        { 
         MyAddedapss.writeList(Teen3Activity.this,MyAddedapss.getAdded_apps()); 
         Toast.makeText(getApplicationContext(), "Apps Added!", Toast.LENGTH_LONG).show(); 
        } 
       } 
      }); 
      packageManager = getPackageManager(); 
      new LoadApplications().execute(); 
     } 

     @Override 
     protected void onListItemClick(ListView l, View v, int position, long id) 
     { 
      super.onListItemClick(l, v, position, id); 

      ApplicationInfo app = applist.get(position); 
      try { 
       Intent intent = packageManager.getLaunchIntentForPackage(app.packageName); 

       if (null != intent) { 
        startActivity(intent); 
       } 
      } catch (ActivityNotFoundException e) { 
       Toast.makeText(Teen3Activity.this, e.getMessage(), Toast.LENGTH_LONG).show(); 
      } catch (Exception e) { 
       Toast.makeText(Teen3Activity.this, e.getMessage(), Toast.LENGTH_LONG).show(); 
      } 
     } 

     private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) 
     { 
      ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>(); 
      for (ApplicationInfo info : list) { 
       try { 
        if (null != packageManager.getLaunchIntentForPackage(info.packageName)) 
        { 
         applist.add(info); 
        } 
       } catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 

      return applist; 
     } 

     private class LoadApplications extends AsyncTask<Void, Void, Void> 
     { 
      private ProgressDialog progress = null; 

      @Override 
      protected Void doInBackground(Void... params) 
      { 
       applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA)); 
       listadaptor = new ApplicationAdapter(Teen3Activity.this, R.layout.row, applist); 

       return null; 
      } 

      @Override 
      protected void onCancelled() 
      { 
       super.onCancelled(); 
      } 

      @Override 
      protected void onPostExecute(Void result) 
      { 
       setListAdapter(listadaptor); 
       progress.dismiss(); 
       super.onPostExecute(result); 
      } 

      @Override 
      protected void onPreExecute() 
      { 
       progress = ProgressDialog.show(Teen3Activity.this, null, "Loading application info..."); 
       super.onPreExecute(); 
      } 

      @Override 
      protected void onProgressUpdate(Void... values) 
      { 
       super.onProgressUpdate(values); 
      } 
     } 
    } 

ApplicationAdapter.java: 
public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo> 
{ 
    private List<ApplicationInfo> appsList = null; 
    private Context context; 
    private PackageManager packageManager; 
    private ArrayList<Boolean> checkList = new ArrayList<Boolean>(); 

    public ApplicationAdapter(Context context, int textViewResourceId, List<ApplicationInfo> appsList) 
    { 
     super(context, textViewResourceId, appsList); 
     this.context = context; 
     this.appsList = appsList; 
     packageManager = context.getPackageManager(); 
     for (int i = 0; i < appsList.size(); i++) { 
      checkList.add(false); 
     } 
    } 

    @Override 
    public int getCount() { 
     return ((null != appsList) ? appsList.size() : 0); 
    } 

    @Override 
    public ApplicationInfo getItem(int position) { 
     return ((null != appsList) ? appsList.get(position) : null); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = convertView; 
     if (null == view) { 
      LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = layoutInflater.inflate(R.layout.row, null); 
     } 

     ApplicationInfo data = appsList.get(position); 
     if (null != data) { 
      TextView appName = (TextView) view.findViewById(R.id.app_name); 
      TextView packageName = (TextView) view.findViewById(R.id.app_paackage); 
      ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); 

      CheckBox checkBox = (CheckBox) view.findViewById(R.id.cb_app); 
      checkBox.setTag(Integer.valueOf(position)); // set the tag so we can identify the correct row in the listener 
      checkBox.setChecked(checkList.get(position));// set the status as we stored it 
      checkBox.setOnCheckedChangeListener(mListener); // set the listener 

      appName.setText(data.loadLabel(packageManager)); 
      packageName.setText(data.packageName); 
      iconview.setImageDrawable(data.loadIcon(packageManager)); 
     } 
     return view; 
    } 
    CompoundButton.OnCheckedChangeListener mListener = new CompoundButton.OnCheckedChangeListener() 
    { 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
     { 
      checkList.set((Integer)buttonView.getTag(),isChecked); // get the tag so we know the row and store the status 
      if(isChecked) 
      { 
       int addapppos = (Integer) buttonView.getTag(); 
       ApplicationInfo p=appsList.get(addapppos); 
       MyAddedapss.setAdded_apps(p); 
       buttonView.setEnabled(false); 
      } 
     } 
    }; 
} 

MyAddedApps。 java :(用於存儲用戶選擇的應用程序的類)

public class MyAddedapss extends Application 
{ 
    private static ArrayList<ApplicationInfo> added_apps=new ArrayList<ApplicationInfo>(); 


    public static void setAdded_apps(ApplicationInfo element) 
    { 

     added_apps.add(element); 
    } 

    public static ArrayList<ApplicationInfo> getAdded_apps() 
    { 
     return added_apps; 
    } 

    public static boolean remove_app(ApplicationInfo element) 
    { 
     return added_apps.remove(element); 
    } 
} 

回答

0

但我在保存和用戶檢索所選應用

挽救他們包名到SQLite數據庫有問題,SharedPreferences或文件的一些其他形式(如,JSON)。

最後一種辦法就是存儲和檢索通過SQLite數據庫的applicationInfo對象,但我不知道如何插入和從數據庫

您不能檢索的ApplicationInfo對象/。您可以保存它們的程序包名稱。然後,在將來運行您的應用時,您將加載這些軟件包名稱,並通過PackageManager獲取Android的ApplicationInfo對象。

相關問題