Android第一行コード読みノート-2

23452 ワード

七、運転時権限
6.0以下のシステムはAndroid Manifest.xmlに必要な権限を加えるだけで、ユーザーがインストールに同意した時に一括して付与されます.6.0以降に運転時権限を追加すると、利用中に権限を付与し、いつでも権限を回収することができます.
一般的な権限:申請時にシステムが自動的に授権します.
危険権限:プライバシーと設備の安全を設計するには、手動で授権する必要があります.9組24個です
パーミッションリスト:http://developer.android.google.cn/reference/android/Manifest.permission.html
権限グループ
パーミッションCALENDARREAD_CALENDAR WRITE_CALENDAR CAMERACAMERA CONTACTSREAD_CONTACTS WRITE_CONTACTS GET_ACCOUNTS LOCATIONACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION MICROPHONERECORD_AUDIO PHONEREAD_PHONE_STATE CALL_PHONE READ_CALL_LOG WRITE_CALL_LOG ADD_VOICEMAIL USE_SIP PROCESS_OUTGOING_CALLS SENSORSBODY_SENSORS SMSSEND_SMS RECEIVE_SMS READ_SMS RECEIVE_WAP_PUSH RECEIVE_MMS STORAGEREAD_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE 1、Android Manifest.xmlで声明



    

    
        ......
    
2、コードで申請する
授与と不授与の実行コードを処理する
public class MainActivity extends AppCompatActivity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

       ......

        makeCall.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                if(ContextCompat.checkSelfPermission(ManiActivity.this, Manifest.permission.CALL_PHONE) 
					!= PackageManager.PERMISSION_GRANTED){
					ActivityCompat.requestPermissions(ManiActivity.this, new String[] {Manifest.permission.CALL_PHONE}, 1)
                }
        });

    }

    private void call() {

        try {

            Intent intent = new Intent(Intent.ACTION_CALL);

            intent.setData(Uri.parse("tel:10086"));

            startActivity(intent);

        } catch (SecurityException e) {

            e.printStackTrace();

        }

    }


    @Override

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

        switch (requestCode) {

            case 1:

                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    call();

                } else {

                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();

                }

                break;

            default:

        }

    }

} 
八、コンテントProvider
APPはContentProviderを通じて、そのデータを外部に提供します.このデータに対してCRUD操作を実行するには、まずConteextのget ContintentResolaver()を通じてContentResolaverクラスを取得します.このクラスでinsert()を呼び出すなどの方法があります.これらの方法はいずれもUriパラメータ指定の内容を受信します.
content://author+パス
Uri mUri = Uri.parse("content://com.example.app.provider/table1");
1、Android Manifest.xml




    

        .......

        

        

    

2、MyDatabaseHelper
データベースの作成
public class MyDatabaseHelper extends SQLiteOpenHelper {

    public static final String CREATE_BOOK = "create table Book ("

            + "id integer primary key autoincrement, "

            + "author text, "

            + "price real, "

            + "pages integer, "

            + "name text)";

    public static final String CREATE_CATEGORY = "create table Category ("

            + "id integer primary key autoincrement, "

            + "category_name text, "

            + "category_code integer)";

    private Context mContext;

    public MyDatabaseHelper(Context context, String name,
                            SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);

        mContext = context;

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(CREATE_BOOK);

        db.execSQL(CREATE_CATEGORY);

       // Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("drop table if exists Book");

        db.execSQL("drop table if exists Category");

        onCreate(db);

    }

}
3、Data BaseProvider.java
ContentProviderを作成するには、各種の操作方法を書き換えて、getTypeはUriオブジェクトのMIMEタイプに戻ります.
カタログ:vnd.android.cursor.dir/vnd.com.example.databasetest.provider.category
ファイル:vnd.android.cursor.item/vnd.com.example.databasetest.provider.category
public class DatabaseProvider extends ContentProvider {

    public static final int BOOK_DIR = 0;

    public static final int BOOK_ITEM = 1;

    public static final int CATEGORY_DIR = 2;

    public static final int CATEGORY_ITEM = 3;

    public static final String AUTHORITY = "com.example.databasetest.provider";

    private static UriMatcher uriMatcher;

    private MyDatabaseHelper dbHelper;

    static {

        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

        uriMatcher.addURI(AUTHORITY, "book", BOOK_DIR);

        uriMatcher.addURI(AUTHORITY, "book/#", BOOK_ITEM);/#        

        uriMatcher.addURI(AUTHORITY, "category", CATEGORY_DIR);

        uriMatcher.addURI(AUTHORITY, "category/#", CATEGORY_ITEM);

    }
    @Override
    public boolean onCreate() {

        dbHelper = new MyDatabaseHelper(getContext(), "BookStore.db", null, 2);

        return true;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        //     
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = null;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                cursor = db.query("Book", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case BOOK_ITEM:
                String bookId = uri.getPathSegments().get(1);
                cursor = db.query("Book", projection, "id = ?", new String[] { bookId }, null, null, sortOrder);
                break;
            case CATEGORY_DIR:
                cursor = db.query("Category", projection, selection, selectionArgs, null, null, sortOrder);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                cursor = db.query("Category", projection, "id = ?", new String[] { categoryId }, null, null, sortOrder);
                break;
            default:
                break;
        }
        return cursor;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        //     
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Uri uriReturn = null;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
            case BOOK_ITEM:
                long newBookId = db.insert("Book", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);
                break;
            case CATEGORY_DIR:
            case CATEGORY_ITEM:
                long newCategoryId = db.insert("Category", null, values);
                uriReturn = Uri.parse("content://" + AUTHORITY + "/category/" + newCategoryId);
                break;
            default:
                break;
        }
        return uriReturn;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        //     
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int updatedRows = 0;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                updatedRows = db.update("Book", values, selection, selectionArgs);
                break;
            case BOOK_ITEM:
                String bookId = uri.getPathSegments().get(1);
                updatedRows = db.update("Book", values, "id = ?", new String[] { bookId });
                break;
            case CATEGORY_DIR:
                updatedRows = db.update("Category", values, selection, selectionArgs);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                updatedRows = db.update("Category", values, "id = ?", new String[] { categoryId });
                break;
            default:
                break;
        }
        return updatedRows;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        //     
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int deletedRows = 0;
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
                deletedRows = db.delete("Book", selection, selectionArgs);
                break;
            case BOOK_ITEM:
                String bookId = uri.getPathSegments().get(1);
                deletedRows = db.delete("Book", "id = ?", new String[] { bookId });
                break;
            case CATEGORY_DIR:
                deletedRows = db.delete("Category", selection, selectionArgs);
                break;
            case CATEGORY_ITEM:
                String categoryId = uri.getPathSegments().get(1);
                deletedRows = db.delete("Category", "id = ?", new String[] { categoryId });
                break;
            default:
                break;
        }
        return deletedRows;
    }

    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)) {
            case BOOK_DIR:
               return "vnd.android.cursor.dir/vnd.com.example.databasetest. provider.book";
            case BOOK_ITEM:
                return "vnd.android.cursor.item/vnd.com.example.databasetest. provider.book";
            case CATEGORY_DIR:
                return "vnd.android.cursor.dir/vnd.com.example.databasetest. provider.category";
            case CATEGORY_ITEM:
                return "vnd.android.cursor.item/vnd.com.example.databasetest. provider.category";
        }
        return null;
    }
}
4、ManiActivity操作ContentProvider
public class MainActivity extends AppCompatActivity {
    private MyDatabaseHelper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                dbHelper.getWritableDatabase();
            }
        });

        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                //          
                values.put("name", "The Da Vinci Code");
                values.put("author", "Dan Brown");
                values.put("pages", 454);
                values.put("price", 16.96);
                db.insert("Book", null, values); //        
                values.clear();
                //          
                values.put("name", "The Lost Symbol");
                values.put("author", "Dan Brown");
                values.put("pages", 510);
                values.put("price", 19.95);
                db.insert("Book", null, values); //        
            }
        });

        Button updateData = (Button) findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("price", 10.99);
               db.update("Book", values, "name = ?", new String[] { "The Da Vinci Code" });
            }
        });

        Button deleteButton = (Button) findViewById(R.id.delete_data);

        deleteButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                db.delete("Book", "pages > ?", new String[] { "500" });
            }
        });
        Button queryButton = (Button) findViewById(R.id.query_data);
        queryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                //   Book       
                Cursor cursor = db.query("Book", null, null, null, null, null, null);
                if (cursor.moveToFirst()) {
                    do {
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                        double price = cursor.getDouble(cursor.getColumnIndex("price"));
                    } while (cursor.moveToNext());
                }
                cursor.close();
            }
        });
    }
}
九、サービス
Serviceは、APPのバックグラウンド運転を実現し、ユーザーと対話しないが、長期的に実行したいタスクに適しています.サービスは別々のプロセスでは実行されません.サービスの作成時のアプリケーションプロセスに依存します.サービスはデフォルトではスレッドを開けません.つまり、メインスレッドではデフォルトでは手動でスレッドを作成する必要があります.
1、マルチスレッド操作
#    
class MyThread extend Thread {
	public void run() {
		
	}
}
//  
new MyThread().start();

#    
class MyThread implements Runnable {
	public void run() {
		
	}
}
//  
MyThread mThread = new MyThread();
new Thread(mThread).start();

#   
new Thread(new Runnable() {
	public void run() {
	
	}
}).start();
2、UI操作
    Androidの中の非同期メッセージは主に4つの部分から構成されています.Message、Handler、Message Que、Looper.MessageQueは、Handlerを介して送信されたメッセージを格納するために使用され、この部分のメッセージは、メッセージ・キューが処理されるのを待つことが知られている.各スレッドにはMessage Queオブジェクトが一つしかありません.Looperは各スレッドMessage Queueの執事であり、Looperのloopを呼び出すと、それを取り出してHandlerのhandler Message()方法に渡す.スレッドごとにLooperオブジェクトが一つしかありません.
    一般的に、まずメインスレッドにHandlerオブジェクトを作成し、HandlerMessage()メソッドを書き換える.サブスレッドがプロセスUI操作を必要とするとき、Messageオブジェクトを作成し、Handlerを介してメッセージを送信する.このメッセージは後でメッセージQueに追加されて処理されるのを待つ.Looperは、Message Queから処理すべきメッセージを取り出し、handlerのhandleMessage()方法に配信することを試みている.
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    public static final int UPDATE_TEXT = 1;
    private TextView text;
    private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPDATE_TEXT:
                    //        UI  
                    text.setText("Nice to meet you");
                    break;
                default:
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (TextView) findViewById(R.id.text);
        Button changeText = (Button) findViewById(R.id.change_text);
        changeText.setOnClickListener(this);
    }

   @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.change_text:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        Message message = new Message();
                        message.what = UPDATE_TEXT;
                       handler.sendMessage(message); //  Message      
                    }
                }).start();
                break;
            default:
                break;
        }
   }
}
3、サービスの基本的な使い方
onCreate()はサービスが初めて作成された時に呼び出す方法ですが、one StartCommand()はサービスを起動するたびに呼び出す方法です.onBind()方法はActivityバインディングサービス時にフィードバックします.
MainService.java
public class MyService extends Service {

    public MyService() {
    }

    private DownloadBinder mBinder = new DownloadBinder();

    class DownloadBinder extends Binder {

        public void startDownload() {
            Log.d("MyService", "startDownload executed");
        }

        public int getProgress() {
            Log.d("MyService", "getProgress executed");
            return 0;
        }

    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("MyService", "onCreate executed");
        Intent intent = new Intent(this, MainActivity.class);
        PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle("This is content title")
                .setContentText("This is content text")
                .setWhen(System.currentTimeMillis())
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setContentIntent(pi)
                .build();
        startForeground(1, notification);//      
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("MyService", "onStartCommand executed");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("MyService", "onDestroy executed");
    }

}
MainActivity    ServiceConnectionのonServiceConnection()とonServiceDisconnected()を書き換えて、彼らは活動とサービスの結合が和解する時に呼び出します.
startService()を呼び出すたびに、ワンストップCommand()が実行されますが、実際にはサービスごとに一例しか存在しません.ですから、何回スタントサービスを呼んでも、一回だけstopService()またはstopSelf()を呼び出す必要があります.bindService()を呼び出してサービスとの持続的な接続を獲得します.この場合はonBind()方法をフィードバックします.このサービスが作成されていない場合は、まずオンクリアー()を呼び出します.
    一つのサービスに対してstartService()を呼び出して、またbindService()を呼び出したら、stopService()とunbindService()方法を同時に呼び出して、one Destroy()方法が実行されます.
public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private MyService.DownloadBinder downloadBinder;

    private ServiceConnection connection = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button startService = (Button) findViewById(R.id.start_service);
        Button stopService = (Button) findViewById(R.id.stop_service);
        startService.setOnClickListener(this);
        stopService.setOnClickListener(this);
        Button bindService = (Button) findViewById(R.id.bind_service);
        Button unbindService = (Button) findViewById(R.id.unbind_service);
        bindService.setOnClickListener(this);
        unbindService.setOnClickListener(this);
        Button startIntentService = (Button) findViewById(R.id.start_intent_service);
        startIntentService.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.start_service:
                Intent startIntent = new Intent(this, MyService.class);
                startService(startIntent); //     
                break;
            case R.id.stop_service:
                Intent stopIntent = new Intent(this, MyService.class);
                stopService(stopIntent); //     
                break;
            case R.id.bind_service:
                Intent bindIntent = new Intent(this, MyService.class);
                bindService(bindIntent, connection, BIND_AUTO_CREATE); //     
                break;
            case R.id.unbind_service:
                unbindService(connection); //     
                break;
            case R.id.start_intent_service:
                //       id
                Log.d("MainActivity", "Thread id is " + Thread.currentThread(). getId());
                Intent intentService = new Intent(this, MyIntentService.class);
                startService(intentService);
                break;
            default:
                break;
        }
    }

}
IntentService
サービスのデフォルトはメインスレッドで実行されますが、処理が必要な場合は、Serviceで手動でサブスレッドを開いたり閉じたりする必要があります.AndroidはIntentService類を設計し、起動後に自動的にその中のonHandleIntent()方法を実行し、Ondstroy()方法を実行します.
public class MyIntentService extends IntentService {

    public MyIntentService() {
        super("MyIntentService"); //            
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        //        id
        Log.d("MyIntentService", "Thread id is " + Thread.currentThread(). getId());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("MyIntentService", "onDestroy executed");
    }

}
10、アプリ
    Androidはアプリクラスを提供しています.プログラムが起動するたびに、システムは自動的にこのクラスを初期化します.私たちは自分でこのクラスをカスタマイズして、全体の情報を得ることができます.プログラム運転時は自動的にオンクリアー()を実行し、ActivityではMyAppliation.get Contect()のみ実行する必要があります.
public class MyApplication extends Application {
	private static Context context;
	
	@override
	public void onCreate() {
		context = getApplicationCcontext();
	}
	
	public static Context getContext() {
		return context;
	}
} 
    このアプリをAndroid Manifest.xmlで宣言する必要があります.