Android第一行コード読みノート-2
23452 ワード
七、運転時権限
6.0以下のシステムはAndroid Manifest.xmlに必要な権限を加えるだけで、ユーザーがインストールに同意した時に一括して付与されます.6.0以降に運転時権限を追加すると、利用中に権限を付与し、いつでも権限を回収することができます.
一般的な権限:申請時にシステムが自動的に授権します.
危険権限:プライバシーと設備の安全を設計するには、手動で授権する必要があります.9組24個です
パーミッションリスト:http://developer.android.google.cn/reference/android/Manifest.permission.html
権限グループ
パーミッション
授与と不授与の実行コードを処理する
APPはContentProviderを通じて、そのデータを外部に提供します.このデータに対してCRUD操作を実行するには、まずConteextのget ContintentResolaver()を通じてContentResolaverクラスを取得します.このクラスでinsert()を呼び出すなどの方法があります.これらの方法はいずれもUriパラメータ指定の内容を受信します.
content://author+パス
データベースの作成
ContentProviderを作成するには、各種の操作方法を書き換えて、getTypeはUriオブジェクトのMIMEタイプに戻ります.
カタログ:vnd.android.cursor.dir/vnd.com.example.databasetest.provider.category
ファイル:vnd.android.cursor.item/vnd.com.example.databasetest.provider.category
Serviceは、APPのバックグラウンド運転を実現し、ユーザーと対話しないが、長期的に実行したいタスクに適しています.サービスは別々のプロセスでは実行されません.サービスの作成時のアプリケーションプロセスに依存します.サービスはデフォルトではスレッドを開けません.つまり、メインスレッドではデフォルトでは手動でスレッドを作成する必要があります.
1、マルチスレッド操作
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()方法に配信することを試みている.
onCreate()はサービスが初めて作成された時に呼び出す方法ですが、one StartCommand()はサービスを起動するたびに呼び出す方法です.onBind()方法はActivityバインディングサービス時にフィードバックします.
MainService.java
startService()を呼び出すたびに、ワンストップCommand()が実行されますが、実際にはサービスごとに一例しか存在しません.ですから、何回スタントサービスを呼んでも、一回だけstopService()またはstopSelf()を呼び出す必要があります.bindService()を呼び出してサービスとの持続的な接続を獲得します.この場合はonBind()方法をフィードバックします.このサービスが作成されていない場合は、まずオンクリアー()を呼び出します.
一つのサービスに対してstartService()を呼び出して、またbindService()を呼び出したら、stopService()とunbindService()方法を同時に呼び出して、one Destroy()方法が実行されます.
サービスのデフォルトはメインスレッドで実行されますが、処理が必要な場合は、Serviceで手動でサブスレッドを開いたり閉じたりする必要があります.AndroidはIntentService類を設計し、起動後に自動的にその中のonHandleIntent()方法を実行し、Ondstroy()方法を実行します.
Androidはアプリクラスを提供しています.プログラムが起動するたびに、システムは自動的にこのクラスを初期化します.私たちは自分でこのクラスをカスタマイズして、全体の情報を得ることができます.プログラム運転時は自動的にオンクリアー()を実行し、ActivityではMyAppliation.get Contect()のみ実行する必要があります.
6.0以下のシステムはAndroid Manifest.xmlに必要な権限を加えるだけで、ユーザーがインストールに同意した時に一括して付与されます.6.0以降に運転時権限を追加すると、利用中に権限を付与し、いつでも権限を回収することができます.
一般的な権限:申請時にシステムが自動的に授権します.
危険権限:プライバシーと設備の安全を設計するには、手動で授権する必要があります.9組24個です
パーミッションリスト:http://developer.android.google.cn/reference/android/Manifest.permission.html
権限グループ
パーミッション
CALENDAR
READ_CALENDAR
WRITE_CALENDAR
CAMERA
CAMERA
CONTACTS
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE
RECORD_AUDIO
PHONE
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS
BODY_SENSORS
SMS
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE
READ_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:
}
}
}
八、コンテントProviderAPPは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.javaContentProviderを作成するには、各種の操作方法を書き換えて、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操作ContentProviderpublic 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で宣言する必要があります.