[android] 360 핸드폰 위사의 간편한 디자인 사고방식과 원본 코드 모방

17912 단어
필자는 최근에 광저우를 가득 메우느라 바빠서 실습도 어렵고 찾기도 어렵고 블로그도 오랫동안 업데이트를 하지 않았다.모조 360 핸드폰 위사의 실현 목적은 주로 상용 지식에 대한 공고함에서 비롯된 것이다. 나 같은 접촉한 지 얼마 되지 않은 학습자들이 학습을 하면서 코드를 쓰는 느낌을 유지하는 데 적합한 작은 프로젝트이다.
관련된 기술:
모두 매우 자주 사용되는android 상용 개발이지만, 관련 범위가 비교적 넓죠.(편집자 쪽에서도 새로운 뜻을 말할 수 없으니 간단명료하게 몇 가지 예를 들어 양해해 주십시오~!)도 숙련된 목적에서 비롯된 것입니다. 이 프로젝트를 쓸 때도 비교적 많은 컨트롤러를 사용했고 어떤 때는 문제도 다른 방법을 사용했습니다. 예를 들어 서버의 xml 파일을 분석하는 데 일반적인 json 데이터 해석을 사용했습니다.gson 데이터 분석 데이터도 사용했다(이 gson은 현재 대부분의 회사에서 사용되고 있다고 하는데 편집자에out이 좀 생겼나, 하하).listview 디자인이 더 많아요. 일반적인listview+viewholder 작은 최적화 사고방식을 제외하고 어떤 부분도 하나의 종류의 머리에 고정된listview를 사용합니다.일부 지역에서는 사용자 정의listview를 사용하여 옆으로 당겨서 삭제할 수 있고listview 항목에 애니메이션을 추가하여 시각적 효과를 증가시킬 수 있다.또한listview 데이터를 불러올 때 전통적인 불러올 수 있고, 분할 불러오기, 페이지 불러오기에도 사용된다.(하하, 그래도 재미있다) 다른 디테일은 여러분이 흥미가 있으면 코드에 직접 들어가서 얕잡아 보는 것도 괜찮습니다. 물론 많은 애니메이션과 사용자 정의 컨트롤러도 사용되고 아래 각 부분의 기능 소개도 간단히 말씀드리겠습니다.
기능은 다음과 같습니다.
문장에 한계가 있으니, 편집자 쪽에서는 코드를 나열하지 않는다.
      
1. 핸드폰 도난 방지
기능 설명: 메인 인터페이스에서 핸드폰 도난 방지 버튼을 누르면 비밀번호 입력 상자(처음 들어갈 경우 비밀번호 설정 상자 인터페이스)가 뜨고, 비밀번호의 저장 방식은 MD5 암호화를 거쳐 SharePreference에 저장되며, 비밀번호를 검증한 후 핸드폰 도난 방지 페이지로 이동한다(도난 방지 정보를 설정하지 않으면 핸드폰 도난 방지 설정 페이지로 이동한다).그럼 먼저 핸드폰 도난 방지 설정 페이지를 살펴보자. 안전번호 설정,sim카드 연결, 도난 방지 설정 여부.휴대전화 도난 방지 페이지는 설정된 정보를 보여주고 사용자 수정 버튼을 제공한다.도난 방지 기능: (1) 핸드폰을 켜서 감청하고sim카드의 변화를 변경하면 안전번호에 알림 문자를 발송한다.(2) 핸드폰을 분실한 상황에서 원격 문자 제어를 통해 도난당한 핸드폰의 데이터 제거, 도난당한 핸드폰의 위치추적, 도난당한 핸드폰의 잠금 화면 설정과 화면 보호, 도난당한 핸드폰의 경보 음악 방송을 제어한다.
기술 실현: (1)sim카드 변화 검출: 핸드폰 도난 방지 페이지에서sim카드 버튼 변화를 감청하고, 버튼이 켜지면 핸드폰 도난 방지와sim카드 버튼이 켜진 상황에서 라디오 BootCompleteReceiver를 켜면 현재 핸드폰의sim카드 번호를 획득하여 원래 저장된sim카드 번호와 비교(TelephonyManager를 통해)할 수 있다. 그렇지 않으면,SmsManager 객체와 보안 번호로 문자 메시지를 보냅니다.(2) 핸드폰 위치추적, 핸드폰 데이터 정리, 핸드폰 도난 방지 및 핸드폰 경보 음악 재생: 문자 감청 방송을 통해 단거리 내용을 얻어 원래 설정한 구령과 놀라움을 비교한다. 데이터 정리와 원키 잠금 화면은 설비 관리자인 DevicePolicy Manager를 통해 현실화되고 핸드폰 위치추적은 하나의 서비스로 위치 변화를 감청한다.(3) 휴대폰 연락처에서 번호를 선택: 휴대폰에 내장된 데이터베이스를 읽고 쓰는 것과 같다.
  
일부 기능 표시:
2. 통신위사
기능 설명: (1), 블랙리스트 추가(두 가지 방식: 입력 상자를 통해 입력하는 방식, 그리고 휴대전화 연락처를 호출하는 방식).(2)、블랙리스트 조회하기;(3) 블랙리스트에 있는 단식과 전화를 차단한다.
기술 실현: (1) 블랙리스트 추가: 데이터베이스 테이블을 만들고 이를 봉인하여 블랙리스트 번호를 데이터베이스에 저장한다.(2) 블랙리스트 조회: 적합한 데이터베이스를 찾지 못했기 때문에 블랙리스트 데이터베이스는 방금 만들어진 블랙리스트 데이터베이스로 대체하고 데이터베이스를 조회한다.(3) 문자 메시지와 전화 차단: (이 기능은 설정 센터에서 설정하고 기본적으로 켜진 상태입니다. 즉, splash 페이지에서 블랙리스트 서비스를 직접 켜는 것입니다) 이벤트 관리자Activity Manager를 통해 백엔드에서 실행 중인 서비스를 가져와 블랙리스트 서비스가 켜졌는지 확인합니다.1. 전화 차단: 전화 관리자Telepony Manager를 통해 핸드폰의 전화 상태를 감청하고 전보 번호를 얻으며 데이터베이스를 조회한다. 만약에 블랙리스트 데이터베이스에 이 번호가 존재하면 반사방식으로 시스템을 통해 전화를 차단하고 콘텐츠provider 방식으로 전화기록에 있는 전보 기록을 삭제한다.2. 문자 차단: 서비스에서 동적 등록 방송을 하고 SmsManager 대상을 통해 문자 번호로 돌아가 데이터베이스를 조회하고 abortBroadcast를 호출하여 문자 메시지를 차단한다.
일부 기능 표시:
3. 소프트웨어 관리
기능 설명: 시스템에 설치된 응용 프로그램을 가져와 핸드폰 응용 프로그램과 시스템 응용 프로그램으로 분류하여listview를 통해 표시합니다.모든 항목의 응용 프로그램을 클릭하여 이 응용 프로그램의 동작: 실행, 마운트 해제, 공유 및 상세한 정보를 공유합니다.
기술 실현: (1), 핸드폰 안드로이드 얻기 응용: 시스템이 제공하는 패키지 관리자를 통해 응용 정보를 얻고, (2), 실행, 마운트 해제, 공유, 상세한 정보: StartAcitvity()를 통해 대응하는activity 조작으로 이동한다.
일부 기능 표시:
4. 프로세스 관리
기능 설명: 시스템이 실행 중인 응용 프로그램에 대한 자세한 정보를 얻습니다.listview에 표시됩니다.단일 항목에 대한 정리 프로세스 또는 전체 정리를 선택할 수 있습니다.
기술 실현: 패키지 관리자 Package Manager와 작업 관리자를 통해 시스템이 실행 중인 프로세스에 대한 상세한 정보를 얻고, 사용자 정의listview 전시(사이드 슬라이딩으로 단일 프로세스를 정리하고, 한 키로 자신을 제외한 프로세스를 정리), 정리는 주로killbackgroupprocess 방법을 호출합니다.
일부 기능 표시:
5. 핸드폰 바이러스 백신
기능 설명: 핸드폰에 사용되는 앱을 스캔하여 바이러스가 바이러스 처리 페이지로 이동하는 것을 발견하면 사용자가 정확하게 선택할 수 있도록 합니다.
기술 실현: 시스템의 패키지 관리자인 Package Manager를 통해 패키지 이름을 얻고 패키지 이름을md5 처리하여 데이터베이스에 있는md5 바이러스 이름인md5와 비교한다(핸드폰의 응용은 apk 형식으로 존재한다).만약 바이러스가 응용 프로그램 마운트 해제 인터페이스로 넘어가면 사용자가 정리할 수 있습니다.
일부 기능 표시:
6. 전화 귀속지 조회
기능 설명: (1), 전화 귀속지 조회, (2), 왕래 전기 귀속지 표시
기술 실현: (1) 전화 귀속지 조회: 데이터베이스와 관련된 조작, 작은 프로젝트에 사용되는 것이 비교적 많고 봉인하는 것도 차이가 많지 않다.(2) 전보 귀속지 표시: 표시: 사용자 정의 윈도 관리자는 사용자 정의view를 표시하고, 전보 감청: 전보 감청 서비스를 정의하고, 전화 상태를 감청하여 전화번호를 얻고, 데이터베이스에 호출하여 이 번호의 귀속지를 조회하여view에 표시한다.귀속지 스타일: (간단하고 몇 가지 배경),귀속지 위치 설정(ontouchevent를 통해 촉점 위치를 감청하여 이동점 좌표를 가져오고 다시 그리기(onmeasure onlayout ondraw(이 세 가지 과정)) 그러나 주의해야 할 것은 액티브에서 window 관리자를 다시 그리는 것과 차이가 있다는 것이다. 상세한 비교 코드는 비교적 상세한 설명이 있다(Address Service와 DragViewActivity).
일부 기능 표시:
7. 프로그램 자물쇠
기능 설명: 시스템의 모든 응용 프로그램에 대해 사용자가 잠금을 선택하고 잠긴 프로그램의 비밀번호를 보호할 수 있도록 합니다
기술 실현: (1) 잠금 및 위 잠금 응용 프로그램 전시: 두 개의fragmengt를 통해 사용자는 잠금 또는 잠금되지 않은fragment의listviewde item를 클릭하여 응용 프로그램 패키지 이름을 추가하고 삭제합니다.(2) 잠금 프로그램의 암호 보호: 서비스에서 문지기 프로그램을 실현하고 응용 작업 창고의 첫 번째 응용 프로그램을 감시한다. 만약에 첫 번째 응용 프로그램이 보호된 응용 데이터베이스에 존재하면 암호 입력 인터페이스로 전환한다.
현재 문제가 존재한다. 현재 이쪽 점프 인터페이스는 아직 실현되지 않았다. 문제는 일시적으로 가능한 포지셔닝이 권한 문제이기 때문에 더 많은 조사가 필요하다.
기본 기능은 여기까지입니다. 아직도 많은 버그가 있습니다. 이 시간도 비교적 바쁘고 버그의 진전이 비교적 느립니다.BaseActivity에서 하는 작업은 간단합니다. 제스처의 미끄럼을 감시하고 코드도 간단합니다. 코드를 직접 보십시오.
public abstract class BaseActivity extends Activity{
    private GestureDetector gestureDetector;
    public SharedPreferences mPrefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mPrefs = getSharedPreferences("config",MODE_PRIVATE);

        gestureDetector = new GestureDetector(this,new GestureDetector.SimpleOnGestureListener(){
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                if(e1.getRawX() - e2.getRawX() > 200){
                    showNextPage();
                    return true;
                }else if(e2.getRawX() - e1.getRawX() > 200)
                {
                    showPreviousPage();
                    return true;
                }
                return super.onFling(e1, e2, velocityX, velocityY);
            }
        });
    }

    protected abstract void showPreviousPage();

    protected abstract void showNextPage();

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);//              
        return super.onTouchEvent(event);
    }
}

splash인터페이스 초기화 작업: 사용자가 처음 다운로드할 때 외부 데이터베이스를 사용자 핸드폰 sd카드 디렉터리에 복사하여 버전 업데이트를 판단하고 데스크톱 단축키를 만드는지 판단하며 정지 서비스를 시작하는지 등 코드를 직접 보십시오.
public class SpashActivity extends AppCompatActivity {
    protected static final int CODE_UPDATE_DIALOG = 0;
    protected static final int CODE_URL_ERROR = 1;
    protected static final int CODE_NET_ERROR = 2;
    protected static final int CODE_JSON_ERROR = 3;
    protected static final int CODE_ENTER_HOME = 4;//      

    private TextView tvVersion;
    private RelativeLayout rlRoot;

    //         
    private String mVersionName;//    
    private int mVersionCode;//    
    private String mDesc;//     
    private String mDownloadUrl;//     

    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case CODE_UPDATE_DIALOG:
                    showUpdateDailog();
                    break;
                case CODE_URL_ERROR:
                    Toast.makeText(SpashActivity.this, "url  ", Toast.LENGTH_SHORT)
                            .show();
                    enterHome();
                    break;
                case CODE_NET_ERROR:
                    Toast.makeText(SpashActivity.this, "    ", Toast.LENGTH_SHORT)
                            .show();
                    enterHome();
                    break;
                case CODE_JSON_ERROR:
                    Toast.makeText(SpashActivity.this, "      ",
                            Toast.LENGTH_SHORT).show();
                    enterHome();
                    break;
                case CODE_ENTER_HOME:
                    enterHome();
                    break;

                default:
                    break;
            }
        };
    };

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

        copyDB("address.db");//           

        //               
        copyDB("antivirus.db");

        startService(new Intent(this, CallSafeService.class));

        //Intent watchDogIntent = new Intent(this, WatchDogService.class);
        //startService(watchDogIntent);

        initView();
        opEvents();
        checkVersion();
    }

    private void opEvents() {
        tvVersion.setText("   :" + getVersionName());

        AlphaAnimation alphaAnimation = new AlphaAnimation(0.3f,1f);
        alphaAnimation.setDuration(2000);
        rlRoot.startAnimation(alphaAnimation);
    }

    private String getVersionName() {
        PackageManager packageManager = getPackageManager();
        try {
            PackageInfo packageInfo = packageManager.getPackageInfo(
                                            getPackageName(),0);
            String  versionName = packageInfo.versionName;
            return versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     *     app    
     *
     * @return
     */
    private int getVersionCode() {
        PackageManager packageManager = getPackageManager();
        try {
            PackageInfo packageInfo = packageManager.getPackageInfo(
                    getPackageName(), 0);//       

            int versionCode = packageInfo.versionCode;
            return versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            //               
            e.printStackTrace();
        }

        return -1;
    }

    private void initView() {
        tvVersion = (TextView) findViewById(R.id.tv_version);
        rlRoot = (RelativeLayout) findViewById(R.id.rl_root);
    }

    private void checkVersion() {
        final long startTime = System.currentTimeMillis();
        //            
        new Thread() {

            @Override
            public void run() {
                Message msg = Message.obtain();
                HttpURLConnection conn = null;
                try {
                    //      localhost,                 ,   ip(10.0.2.2)   
                    URL url = new URL("http://10.0.2.2:8080/update.json");
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");//       
                    conn.setConnectTimeout(5000);//       
                    conn.setReadTimeout(5000);//       ,     ,          
                    conn.connect();//      

                    int responseCode = conn.getResponseCode();//      
                    if (responseCode == 200) {
                        InputStream inputStream = conn.getInputStream();
                        String result = StreamUtils.readFromStream(inputStream);
                        // System.out.println("    :" + result);

                        //   json
                        JSONObject jo = new JSONObject(result);
                        mVersionName = jo.getString("versionName");
                        mVersionCode = jo.getInt("versionCode");
                        mDesc = jo.getString("description");
                        mDownloadUrl = jo.getString("downloadUrl");
                        // System.out.println("    :" + mDesc);

                        if (mVersionCode > getVersionCode()) {//        
                            //     VersionCode     VersionCode
                            //      ,        
                            msg.what = CODE_UPDATE_DIALOG;
                        } else {
                            //       
                            msg.what = CODE_ENTER_HOME;
                        }
                    }
                } catch (MalformedURLException e) {
                    // url     
                    msg.what = CODE_URL_ERROR;
                    e.printStackTrace();
                } catch (IOException e) {
                    //       
                    msg.what = CODE_NET_ERROR;
                    e.printStackTrace();
                } catch (JSONException e) {
                    // json    
                    msg.what = CODE_JSON_ERROR;
                    e.printStackTrace();
                } finally {
                    long endTime = System.currentTimeMillis();
                    long timeUsed = endTime - startTime;//          
                    if (timeUsed < 2000) {
                        //         ,       2  
                        try {
                            Thread.sleep(2000 - timeUsed);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }

                    mHandler.sendMessage(msg);
                    if (conn != null) {
                        conn.disconnect();//       
                    }
                }
            }
        }.start();
    }

    /**
     *      
     */
    protected void showUpdateDailog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("    :" + mVersionName);
        builder.setMessage(mDesc);
        // builder.setCancelable(false);//         ,       ,     
        builder.setPositiveButton("    ", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                System.out.println("    ");
                download();
            }
        });

        builder.setNegativeButton("    ", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                enterHome();
            }
        });

        //        ,            
        builder.setOnCancelListener(new DialogInterface.OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                enterHome();
            }
        });

        builder.show();
    }

    /**
     *   apk  
     */
    protected void download() {
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {

            //tvProgress.setVisibility(View.VISIBLE);//     

            String target = Environment.getExternalStorageDirectory()
                    + "/update.apk";
            // XUtils
            HttpUtils utils = new HttpUtils();
            utils.download(mDownloadUrl, target, new RequestCallBack<File>() {

                //        
                @Override
                public void onLoading(long total, long current,
                                      boolean isUploading) {
                    super.onLoading(total, current, isUploading);
                   // System.out.println("    :" + current + "/" + total);
                   // tvProgress.setText("    :" + current * 100 / total + "%");
                }

                //     
                @Override
                public void onSuccess(ResponseInfo<File> arg0) {
                    System.out.println("    ");
                    //          
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.addCategory(Intent.CATEGORY_DEFAULT);
                    intent.setDataAndType(Uri.fromFile(arg0.result),
                            "application/vnd.android.package-archive");
                    // startActivity(intent);
                    startActivityForResult(intent, 0);//           ,
                    //      ,    onActivityResult
                }

                //     
                @Override
                public void onFailure(HttpException arg0, String arg1) {
                    Toast.makeText(SpashActivity.this, "    !",
                            Toast.LENGTH_SHORT).show();
                }
            });
        } else {
            Toast.makeText(SpashActivity.this, "    sdcard!",
                    Toast.LENGTH_SHORT).show();
        }
    }

    //           ,     
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        enterHome();
        super.onActivityResult(requestCode, resultCode, data);
    }

    /**
     *      
     */
    private void enterHome() {
        Intent intent = new Intent(this, HomeActivity.class);
        startActivity(intent);
        finish();
    }

    /**
     *      
     *
     * @param dbName
     */
    private void copyDB(String dbName) {
        File filesDir = getFilesDir();
        System.out.println("  :" + filesDir.getAbsolutePath());
        File destFile = new File(getFilesDir(), dbName);//         

       if (destFile.exists()) {
            System.out.println("   " + dbName + "   !");
            return;
        }

        FileOutputStream out = null;
        InputStream in = null;

        try {
            //in = getAssets().open(dbName);
            in = getClassLoader().getResourceAsStream("assets/" + dbName);
            int length = in.available();
            //System.out.println("databasesize" + length);
            out = new FileOutputStream(destFile);

            int len = 0;
            byte[] buffer = new byte[1024];

            while ((len = in.read(buffer)) != -1) {
                out.write(buffer, 0, len);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

 
원본 다운로드 주소: 360 핸드폰 위사 간이 실현 버전 모방
github 포인트 면제 원본 다운로드 주소:github 원본

좋은 웹페이지 즐겨찾기