Android4.0下的Calendar、events、reminder簡單Demo
上週花了不到一個周研究了一下android中的Calendar這個東西,下面把我的收穫與大家分享一下。
我的研究是從閱讀官方文件開始的。官方文件上的開頭部分涉及到了一個ContentProvider和ContentResolver的東西。這個概念在android開發中很重要。
為了在應用程式之間交換資料,android提供了ContentProvider,ContentProvider是不同應用程式之間進行資料交換的標準API,當一個應用程式需要把自己的資料暴露給其他程式使用時,該應用程式就可以通過提供ContentProvider實現。其他應用程式就可以通過ContentResolver來操作ContentProvider暴露的資料(一般是以資料庫的一個表的形式暴露,因此用ContentResolver操作資料時,也很類似對資料庫的表的操作)。
ContentProvider也是android應用的四大元件之一,與Activity、Service、BroadcastReceiver相似,它們都需要在AndroidManifest.xml中配置。
還有,一般來說,ContentProvider是單例模式的,當多個應用程式通過ContentResolver來操作ContentProvider提供的資料時,ContentResolver呼叫的資料將會委託給同一個ContentProvider處理。
一旦某個應用程式通過ContentProvider暴露了自己的資料操作介面,那麼不管該應用程式是否啟動,其他應用程式都可以通過該介面來操作該應用程式的內部資料,包括增刪改查。
還有一個很重要的東西叫Uri(不是Url,其實和Url作用很像的)。通俗一點說就是當你用ContentResolver操作資料時,用Uri來指明資料的url。
使用ContentResolver操作資料的步驟其實很簡單:首先呼叫Activity的getContentResolver( )獲取ContentResolver物件,然後根據需要呼叫ContentResolver的insert( )、update( )、delete( ) 和query方法操作資料即可。為了操作資料,我們需要了解ContentProvider的Uri。這也是上述三個概念的簡單聯絡。
扯了這麼多,其實這個Demo中ContentProvider和ContentResolver的概念體現的不是很明顯。因為我們用的是作業系統給我們的ContentProvider,然後我們自己獲取ContentResolver物件來操作資料,只需要瞭解系統的響應的ContentProvider的Uri即可。
這個Demo實現了為手機上的某個賬戶新增新的event(併為新新增的event新增reminder),查詢所有賬戶的所有Calendar,刪除event等(修改event只需要類似地呼叫ContentResolver的相應的方法即可,本Demo沒有實現),其他還用到了將手機設定成震動,全域性定時器、焦點事件以及TimePickerDialog、DatePickerDialog等,下面上圖:
Android4.0第一次使用引導
Android4.0待機
下面是本Demo的效果:
下面是AndroidCalendarProviderTestActivity.java的程式碼:
package org.ls;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CalendarContract.Calendars;
import android.provider.CalendarContract.Events;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class AndroidCalendarProviderTestActivity extends Activity {
private Button showCalendars;
private Button addEvents;
private Button queryEvents;
private TextView displayEnvents;
private EditText getEventIdEditText;
private Button delEvent;
public static final String[] EVENT_PROJECTION = new String[] {
Calendars._ID, Calendars.ACCOUNT_NAME,
Calendars.CALENDAR_DISPLAY_NAME };
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_ACCOUNT_NAME_INDEX = 1;
private static final int PROJECTION_DISPLAY_NAME_INDEX = 2;
long myEventsId = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
displayEnvents = (TextView) findViewById(R.id.displayevents);
displayEnvents.setMovementMethod(ScrollingMovementMethod.getInstance());
showCalendars = (Button) findViewById(R.id.querycalendars);
showCalendars.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Cursor cur = null;
ContentResolver cr = getContentResolver();
Uri uri = Calendars.CONTENT_URI;
// String selection = "((" + Calendars.ACCOUNT_NAME + // 給出查詢條件,查詢特定使用者的日曆
// " = ?) AND ("+ Calendars.ACCOUNT_TYPE + " = ?))";
// String[] selectionArgs = new String[]
// {"[email protected]", "com.google"};
cur = cr.query(uri, EVENT_PROJECTION, null, null, null); // 查詢條件為null,查詢所有使用者的所有日曆
while (cur.moveToNext()) {
long calID = 0;
String displayName = null;
String accountName = null;
calID = cur.getLong(PROJECTION_ID_INDEX);
displayName = cur.getString(PROJECTION_DISPLAY_NAME_INDEX);
accountName = cur.getString(PROJECTION_ACCOUNT_NAME_INDEX);
showMessageDialog("日曆ID:" + calID + "\n" + "日曆顯示名稱:" + "\n"
+ displayName + "\n" + "日曆擁有者賬戶名稱:" + "\n"
+ accountName);
}
}
});
addEvents = (Button) findViewById(R.id.addevents);
addEvents.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent itent=new Intent();
itent.setClass(AndroidCalendarProviderTestActivity.this,AddNewEventActivity.class);
startActivity(itent); // 啟動新增新event的Activity
}
});
queryEvents = (Button) findViewById(R.id.queryevents);
queryEvents.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(Events.CONTENT_URI, new String[] {
Events._ID, Events.TITLE, Events.DESCRIPTION,
Events.DTSTART, Events.DTEND },
/* Events._ID + "=" + myEventsId */null, null, null); // 註釋中的條件是是查詢特定ID的events
displayEnvents.setText("");
while (cur.moveToNext()) {
Long tempEventsId = cur.getLong(0);
String tempEventsTitle = cur.getString(1);
String tempEventsDecription = cur.getString(2);
String tempEventsStartTime = cur.getString(3);
String tempEventsEndTime = cur.getString(4);
displayEnvents.append(tempEventsId + "\n");
displayEnvents.append(tempEventsTitle + " "
+ tempEventsDecription + "\n");
displayEnvents.append(new SimpleDateFormat(
"yyyy/MM/dd hh:mm").format(new Date(Long
.parseLong(tempEventsStartTime)))
+ "至");
displayEnvents.append(new SimpleDateFormat(
"yyyy/MM/dd hh:mm").format(new Date(Long
.parseLong(tempEventsEndTime)))
+ "\n");
}
}
});
getEventIdEditText = (EditText) findViewById(R.id.geteventid);
delEvent = (Button) findViewById(R.id.delevent);
delEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Long tempEventId = 0l;
try {
tempEventId = Long.parseLong(getEventIdEditText.getText()
.toString());
} catch (Exception e) {
showMessageDialog("請先查詢所有event,然後正確填寫event的id~");
return;
}
// 另一種刪除event方式
// Uri deleteUri =
// ContentUris.withAppendedId(Events.CONTENT_URI, tempEventId);
// int rows = getContentResolver().delete(deleteUri, null,
// null);
ContentResolver cr = getContentResolver();
int rows = cr.delete(Events.CONTENT_URI, Events._ID + "= ?",
new String[] { tempEventId + "" });
showMessageDialog("刪除了一個event:" + rows);
Log.i("delete_event", "Rows deleted: " + rows);
}
});
}
public void showMessageDialog(String info) { // 彈出訊息對話方塊,訊息的內容是info
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(info);
builder.setTitle("information");
builder.setPositiveButton("確定", null);
AlertDialog alert = builder.create();
alert.show();
}
}
下面是AddNewActivity.java的程式碼:
package org.ls; import java.util.Calendar; import android.app.Activity; import android.app.AlarmManager; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.PendingIntent; import android.app.Service; import android.app.TimePickerDialog; import android.content.ContentResolver; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.provider.CalendarContract.Events; import android.provider.CalendarContract.Reminders; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnFocusChangeListener; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.TimePicker; public class AddNewEventActivity extends Activity implements OnClickListener, OnFocusChangeListener { public String eventName; public String eventDescription; public int[] eventBeginDate = new int[3]; public int[] eventBeginTime = new int[2]; public int[] eventEndDate = new int[3]; public int[] eventEndTime = new int[2]; public int reminderMinutes; private EditText eventNameText; private EditText eventDescriptionText; private EditText eventBeginDateText; private EditText eventBeginTimeText; private EditText eventEndDateText; private EditText eventEndTimeText; private EditText reminderminutesText; private Button okButton; private Button goBackButton; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add_event); okButton = (Button) findViewById(R.id.ok); okButton.setOnClickListener(this); goBackButton = (Button) findViewById(R.id.goback); goBackButton.setOnClickListener(this); eventNameText = (EditText)findViewById(R.id.event_name); eventDescriptionText = (EditText)findViewById(R.id.event_description); eventBeginDateText = (EditText) findViewById(R.id.select_begin_date); eventBeginDateText.setFocusable(true); eventBeginDateText.setOnFocusChangeListener(this); eventBeginTimeText = (EditText) findViewById(R.id.select_begin_time); eventBeginTimeText.setFocusable(true); eventBeginTimeText.setOnFocusChangeListener(this); eventEndDateText = (EditText) findViewById(R.id.select_end_date); eventEndDateText.setFocusable(true); eventEndDateText.setOnFocusChangeListener(this); eventEndTimeText = (EditText) findViewById(R.id.select_end_time); eventEndTimeText.setFocusable(true); eventEndTimeText.setOnFocusChangeListener(this); reminderminutesText = (EditText) findViewById(R.id.reminder_minutes); } @Override public void onClick(View v) { if (v == okButton) { eventName = eventNameText.getText().toString(); eventDescription = eventDescriptionText.getText().toString(); reminderMinutes = Integer.parseInt(reminderminutesText.getText() .toString()); // 可在此處新增簡單的判斷使用者輸入新event的各項引數的合法性的判斷,我假設使用者輸入的一定是合法的 addEvent(eventName, eventDescription, eventBeginDate, eventBeginTime, eventEndDate, eventEndTime, reminderMinutes); // 新增新event } else if (v == goBackButton) { goBack(); } } @Override public void onFocusChange(View v, boolean hasFocus) { if (v == eventBeginDateText && hasFocus == true) { Calendar c = Calendar.getInstance(); new DatePickerDialog(AddNewEventActivity.this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { eventBeginDateText.setText("開始日期:" + year + "-" + (monthOfYear+1) + "-" + dayOfMonth); eventBeginDate[0] = year; eventBeginDate[1] = monthOfYear; eventBeginDate[2] = dayOfMonth; } }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)).show(); } else if (v == eventBeginTimeText && hasFocus == true) { Calendar c = Calendar.getInstance(); new TimePickerDialog(AddNewEventActivity.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { eventBeginTimeText.setText("開始時間:" + hourOfDay + "時" + minute + "分"); eventBeginTime[0] = hourOfDay; eventBeginTime[1] = minute; } }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true).show(); } else if (v == eventEndDateText && hasFocus == true) { Calendar c = Calendar.getInstance(); new DatePickerDialog(AddNewEventActivity.this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { eventEndDateText.setText("結束日期:" + year + "-" + (monthOfYear+1) + "-" + dayOfMonth); eventEndDate[0] = year; eventEndDate[1] = monthOfYear; eventEndDate[2] = dayOfMonth; } }, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH)).show(); } else if (v == eventEndTimeText && hasFocus == true) { Calendar c = Calendar.getInstance(); new TimePickerDialog(AddNewEventActivity.this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { eventEndTimeText.setText("結束時間:" + hourOfDay + "時" + minute + "分"); eventEndTime[0] = hourOfDay; eventEndTime[1] = minute; } }, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE), true).show(); } } private void addEvent(String eventName, String eventDescription, int eventBeginDate[], int eventBeginTime[], int eventEndDate[], int eventEndTime[], int reminderMinutus) { long calId = 1; long startMillis = 0; long endMillis = 0; Calendar beginTime = Calendar.getInstance(); beginTime.set(eventBeginDate[0], eventBeginDate[1], eventBeginDate[2], eventBeginTime[0], eventBeginTime[1]); // 注意:月份系統會自動加1 startMillis = beginTime.getTimeInMillis(); Calendar endTime = Calendar.getInstance(); endTime.set(eventEndDate[0], eventEndDate[1], eventEndDate[2], eventEndTime[0], eventEndTime[1]); endMillis = endTime.getTimeInMillis(); ContentResolver cr = getContentResolver(); // 新增新event,步驟是固定的 ContentValues values = new ContentValues(); values.put(Events.DTSTART, startMillis); values.put(Events.DTEND, endMillis); values.put(Events.TITLE, eventName); values.put(Events.DESCRIPTION, eventDescription); values.put(Events.CALENDAR_ID, calId); values.put(Events.EVENT_TIMEZONE, "GMT+8"); Uri uri = cr.insert(Events.CONTENT_URI, values); Long myEventsId = Long.parseLong(uri.getLastPathSegment()); // 獲取剛才新增的event的Id ContentResolver cr1 = getContentResolver(); // 為剛才新新增的event新增reminder ContentValues values1 = new ContentValues(); values1.put(Reminders.MINUTES, reminderMinutus); values1.put(Reminders.EVENT_ID, myEventsId); values1.put(Reminders.METHOD, Reminders.METHOD_ALERT); cr1.insert(Reminders.CONTENT_URI, values1); // 呼叫這個方法返回值是一個Uri setAlarmDeal(startMillis); // 設定reminder開始的時候,啟動另一個activity showMessageDialog("插入成功!" + "\n" + uri.getLastPathSegment() + "\n" + uri.getAuthority()); } private void setAlarmDeal(long time) { // 設定全域性定時器 Intent intent = new Intent(this, AlarmActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0); AlarmManager aManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE); aManager.set(AlarmManager.RTC_WAKEUP, time, pi); // 當系統呼叫System.currentTimeMillis()方法返回值與time相同時啟動pi對應的元件 } public void showMessageDialog(String info) { // 彈出訊息對話方塊,訊息的內容是info,且點選此對話方塊的確定按鈕後會返回 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(info); builder.setTitle("information"); builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { goBack(); } }); AlertDialog alert = builder.create(); alert.show(); } private void goBack() { // 返回 Intent itent = new Intent(); itent.setClass(AddNewEventActivity.this, AndroidCalendarProviderTestActivity.class); startActivity(itent); AddNewEventActivity.this.finish(); } }
下面是event發生時,同時啟動的那個Activity的程式碼,當某個event發生,除了系統會有Notification的提醒,無論本Demo是否正在執行,手機都會啟動這個Activity,將手機設定成為震動,程式碼如下:
package org.ls;
import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.os.Bundle;
public class AlarmActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alarm_activity);
setVibrate(); // 將手機情景模式設為震動
}
private void setVibrate() {
AudioManager audio = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audio.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ON);
audio.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION, AudioManager.VIBRATE_SETTING_ON);
}
}
相關的xml檔案:
alarm_activity.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/alarminfo"
android:id="@+id/displayinfo"
/>
</LinearLayout>
add_event.xml:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/add_new_event">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="在此填寫新event的名字"
android:id="@+id/event_name"
android:selectAllOnFocus="true"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="簡要描述新event"
android:id="@+id/event_description"
android:selectAllOnFocus="true"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="點選選擇開始日期"
android:id="@+id/select_begin_date"
android:selectAllOnFocus="true"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="點選選擇開始時間"
android:id="@+id/select_begin_time"
android:selectAllOnFocus="true"
/>
<!--
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="選擇新event的結束時間:"
/>
-->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="點選選擇結束日期"
android:id="@+id/select_end_date"
android:selectAllOnFocus="true"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="點選選擇結束時間"
android:id="@+id/select_end_time"
android:selectAllOnFocus="true"
/>
<!--
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="為新event的新增reminder:"
/>
-->
<!--
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="新event提前多少分鐘提醒您:"
/>
-->
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="在此填寫新event提前多少分鐘提醒您:"
android:selectAllOnFocus="true"
android:id="@+id/reminder_minutes"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="確定"
android:id="@+id/ok"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="返回"
android:id="@+id/goback"
/>
</LinearLayout>
</ScrollView>
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查詢所有日曆"
android:id="@+id/querycalendars"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="新增新日曆項"
android:id="@+id/addevents"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查詢所有event"
android:id="@+id/queryevents"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="在這裡輸入要刪除event的id"
android:id="@+id/geteventid"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="刪除該event"
android:id="@+id/delevent"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:id="@+id/displayevents"
/>
</LinearLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.ls"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".AndroidCalendarProviderTestActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="AddNewEventActivity"></activity>
<activity android:name="AlarmActivity"></activity>
</application>
<uses-permission android:name="android.permission.READ_CALENDAR"/>
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
</manifest>
另外記住,AlarmActivity一定要在AndroidManifest.xml中註冊,否則,到了event執行時,系統不但不會啟動AlarmActivity,甚至會練各種Log也不會列印;此外還有,Java中的月份是從0開始的,這一點很容易被忽略,一旦忽略會帶來很多匪夷所思的事情,也很讓人苦惱。
相關推薦
Android4.0下的Calendar、events、reminder簡單Demo
上週花了不到一個周研究了一下android中的Calendar這個東西,下面把我的收穫與大家分享一下。 我的研究是從閱讀官方文件開始的。官方文件上的開頭部分涉及到了一個ContentProvider和ContentResolver的東西。這個概念在android開發中很重要
python3.6 + django2.0下的xadmin安裝、配置及報錯解決
用過django的朋友都知道,django自帶的後臺管理系統是一套智慧的管理系統。 今天給大家介紹下一套基於admin, 比admin更強大的系統。 xadmin 原始碼安裝: clone 或者 下載到本地以後,把xadmin資料夾直接拷貝到專案目錄中,就像
nj09---util、inherits、inspect、events、error
cti rip 機制 move 遞歸 整合 多少 指定 ava 一、util全局變量 1.util.inherits(constructor,superConstructor) 此方法是一個實現對象間原型繼承的函數。javaScript通過原型賦值來實現繼承,細節
android4.0下使用multiDexEnabled屬性的踩坑日記
由於公司需要需使用android4.0的裝置進行開發,所以程式碼屬性需針對android做適當調整。 首先新增 multiDexEnabled true 這條屬性是為了解決方法數大於65k的問題。 defaultConfig { minSdkVersion 15
c++11 移動拷貝、移動賦值簡單Demo
#include <iostream> using namespace std; class A { public: A() : p_(new int(3)){ cout << "constructor numbers = :
一起學ASP.NET Core 2.0學習筆記(一): CentOS下 .net core2 sdk nginx、supervisor、mysql環境搭建
image dev 預覽 def star fig brush rest aspnet 作為.neter,看到.net core 2.0的正式發布,心裏是有點小激動的,迫不及待的體驗了一把,發現速度確實是快了很多,其中也遇到一些小問題,所以整理了一些學習筆記: 閱讀目
Windows下python 3.0版本django的安裝、配置、與啟動
減少 操作 註意 class lin img 裏的 bubuko code 使用的環境是Windows操作系統,python的環境是3.6,django是官網上最新的版本1.10.6,本文介紹從安裝python之後怎樣用過pip管理工具安裝django,以及django的項
Tomcat6.0下,請求url帶特殊字元|、\等導致解析出錯
Tomcat6.0下,請求url帶特殊字元|、\等導致解析出錯 背景 由於人力問題,最近被叫去搞下Java web ,幫忙做公司的一個老系統,用的是jdk6 和tomcat6,而我自己電腦之前裝的是jdk1.7和tomcat7 ,覺得應該沒什麼關係就懶得去換。但是前兩天遇
RedHat9.0下 arm-linux-gcc交叉編譯器的安裝、生效、查詢
1. 安裝標準的C開發環境,由於Linux安裝預設是不安裝的,所以需要先安裝一下(如果已經安裝好的話,就可以免去這一步了): #sudo apt-get install gcc g++ libgcc1 libg++ make gdb 2. 下載arm-linux-gcc-3.4.1
Sublime Text 3.0-3059 MAC 、windows、Linux下的破解方法
Sublime Text 3.0-3059 MAC 、windows、Linux下的破解方法 已在mac下親測。 1、首先將下載的“Sublime Text crack” 改名為"Sublime Text"; 2、開啟終端,輸入下載的“Sublime Text crac
input框限制只能輸入正整數,邏輯與和或運算 有時需要限制文字框輸入內容的型別,本節分享下正則表示式限制文字框只能輸入數字、小數點、英文字母、漢字等程式碼。 例如,輸入大於0的正整數 程式碼
有時需要限制文字框輸入內容的型別,本節分享下正則表示式限制文字框只能輸入數字、小數點、英文字母、漢字等程式碼。 例如,輸入大於0的正整數 程式碼如下: <input onkeyup="if(this.value.length==1){this.value=this.value.replace(/[^
【圖解】Eclipse下JRebel6.2.0熱部署外掛安裝、破解及配置
標籤: 這兩天在做後臺管理系統,前端框架用Bootstrap,後端用SpringMVC+Velocity。在開發過程中,經常需要對介面進行微調,調整傳參等,每次更改一次java程式碼,就得重新部署一次,耗在各種等待上的時間太多了。因此下決心將JRebel外掛裝上。
【圖解】Eclipse下JRebel6.2.0熱部署外掛安裝、破解及配置【轉】
標籤: 這兩天在做後臺管理系統,前端框架用Bootstrap,後端用SpringMVC+Velocity。在開發過程中,經常需要對介面進行微調,調整傳參等,每次更改一次java程式碼,就得重新部署一次,耗在各種等待上的時間太多了。因此下決心將JRebel外掛裝上。 第一步,安裝: 接著,
CentOS6.5下redis3.0.7安裝、啟動、關閉、配置密碼、開機啟動詳細步驟
安裝環境: CentOS 6.5 Redis 3.0.7 下載安裝: 下載檔案到 /usr/local 目錄下 解壓檔案 tar zxvf redis-3.0.7.tar.gz 切換目錄到 redis-3.0.7 目錄下 cd redis-3
window 環境下 apache james 3.0-beta4 安裝、搭建、執行。
注意:apache james 3.0-beta4 不可以在JDK7環境下使用,會出現jar包衝突問題,必須在JDK6環境下執行。 參考資料: *Install http://james.apache.org/server/3/install.html *
阿里雲Linux下安裝MySql5.6、5.7、8.0版本和解除安裝以及遠端連線
在安裝的時候參考了很多部落格,但是發現還是 MySql的官網給的步驟最有效,最權威。 適合: Debian 7,8,9 Ubuntu 14.04,16.04,17.10,18.04 下面記錄下我安裝的步驟: 1,新增 MySQL APT儲存庫 首先我們需要
如何隱藏Android4.0及以上版本的ActionBar、NotificationBar、StatusBar、SystemBar、TitleBar
1.ActionBar: <activityandroid:name="Demo"android:label="@string/app_name"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"&
List、Set、Map下各類型的對比
hashtable class ray hashmap 速查 使用 線程同步 highlight ash 1.List和Set: List: 元素有放入順序,元素可重復,查找效率高,插入刪除效率低; Set: 元素無放入順序,元素不可重復,(元素雖然無順序,但元素在Set
linux環境下部署zabbix3.2、模板、郵件告警詳細過程
-1 ice erer without zlib zip ever native item 服務端部署: 系統環境及軟件版本: Linux:release 6.3 zabbix:zabbix-3.2.5.tar.gz nginx:nginx-1.12.0.tar.gz ph
Atitit 如何創新 創新只有在兩種條件下發生:自由、效率。
會議 center 有用 渠道 城市 catch 編輯 .net 工程 Atitit 如何創新 創新只有在兩種條件下發生:自由、效率。 創新是如何發生的呢? 創新只有在兩種條件下發生:自由、效率。在自由的環境下,對效率的追逐等於創新。如果你不自由,你的思想不夠開闊,