首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Android开发学习笔记:Notification和NotificationManager浅析

NotificationManager 获取NotificationManager String service = Context.NOTIFICATION_SERVICE; NotificationManager mNotificationManager =(NotificationManager)getSystemService(service); Notification //实例化Notification Notificationnotification=newNotification(); 3.设置Notification的属性 //设置显示图标,该图标会在状态栏显示 inticon=notification.icon=R.drawable.happy; //设置显示提示信息,该信息也在状态栏显示 StringtickerText="测试Notification"; //显示时间 longwhen=System.currentTimeMillis();notification.icon=icon; notification.tickerText=tickerText; notification.when=when; //也可以这样设置 Notificationnotification_2=newNotification(icon,tickerText,when) 调用setLatestEventInfo()方法在视图中设置图标和时间。 //实例化Intent Intentintent=newIntent(MainActivity.this,MainActivity.class); //获得PendingIntent PendingIntentpIntent=PendingIntent.getActivity(MainActivity.this,0,intent,0); //设置事件信息 notification.setLatestEventInfo(MainActivity.this,"Title","Content",pIntent); 4.发出通知 //Notification标示ID privatestaticfinalintID=1; //发出通知 mNotificationManager.notify(ID,n); 下面是具体的例子,在这个例子里定义了一个MainActivity发出广播通知,定义一个MyReceiver类继承Broadcasts接受通知,当接收完通知之后,启动一个SecondActivity,在SecondActivity类中通过Notification和NotificationManager来可视化显示广播通知。具体的步骤如下: MainActivity.java packagecom.android.notification; importandroid.app.Activity; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassMainActivityextendsActivity{ //声明Button privateButtonbtn; //定义BroadcastReceiveraction privatestaticfinalStringMY_ACTION="com.android.notification.MY_ACTION"; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //设置当前布局视图 setContentView(R.layout.main); //实例化Button btn=(Button)findViewById(R.id.Button1); //添加事件监听器 btn.setOnClickListener(listener); } //创建事件监听器 privateOnClickListenerlistener=newOnClickListener(){ @Override publicvoidonClick(Viewv){ //实例化Intent Intentintent=newIntent(); //设置Intentaction属性 intent.setAction(MY_ACTION); //发起广播 sendBroadcast(intent); } }; } MyReceiver.java packagecom.android.notification; importandroid.content.BroadcastReceiver; importandroid.content.Context; importandroid.content.Intent; publicclassMyReceiverextendsBroadcastReceiver{ @Override publicvoidonReceive(Contextcontext,Intentintent){ //实例化Intent Intenti=newIntent(); //在新的任务中启动Activity i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //设置Intent启动的组件名称 i.setClass(context,SecondActivity.class); //启动Activity显示通知 context.startActivity(i); } } SecondActivity.java packagecom.android.notification; importandroid.app.Activity; importandroid.app.Notification; importandroid.app.NotificationManager; importandroid.app.PendingIntent; importandroid.content.Intent; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassSecondActivityextendsActivity{ //声明按钮 privateButtoncancelBtn; //声明Notification privateNotificationnotification; //声明NotificationManager privateNotificationManagermNotification; //Notification标示ID privatestaticfinalintID=1; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.second); //实例化按钮 cancelBtn=(Button)findViewById(R.id.cancelButton2); //获得NotificationManager实例 Stringservice=NOTIFICATION_SERVICE; mNotification=(NotificationManager)getSystemService(service); //实例化Notification notification=newNotification(); //设置显示图标,该图标会在状态栏显示 inticon=notification.icon=android.R.drawable.stat_notify_chat; //设置显示提示信息,该信息也会在状态栏显示 StringtickerText="TestNotification"; //显示时间 longwhen=System.currentTimeMillis(); notification.icon=icon; notification.tickerText=tickerText; notification.when=when; //实例化Intent Intentintent=newIntent(this,MainActivity.class); //获得PendingIntent PendingIntentpi=PendingIntent.getActivity(this,0,intent,0); //设置事件信息 notification.setLatestEventInfo(this,"消息","HelloAndroid",pi); //发出通知 mNotification.notify(ID,notification); //为按钮添加监听器 cancelBtn.setOnClickListener(cancelListener); } //取消通知监听器 privateOnClickListenercancelListener=newOnClickListener(){ @Override publicvoidonClick(Viewv){ //取消通知 mNotification.cancel(ID); } }; } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:text="发出广播通知" android:id="@+id/Button1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> second.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:text="显示通知界面" android:id="@+id/TextView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="取消通知" android:id="@+id/cancelButton2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 在AndroidManifest.xml文件中16~21加入对receiver,SecondActivity的声明 <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.android.notification" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="10"/> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <receiverandroid:name="MyReceiver"> <intent-filter> <actionandroid:name="com.android.notification.MY_ACTION"/> </intent-filter> </receiver> <activityandroid:name="SecondActivity"/> </application> </manifest> 效果图: Notification丰富的提示方式: 声音提醒 ·使用默认声音 notification.defaults |= Notification.DEFAULT_SOUND; ·使用自定义声音 notification.sound = Uri.parse("file:///sdcard/notification/ringer.mp3"); ·注:如果定义了默认声音,那么自定义声音将被覆盖 振动提醒 ·使用默认振动 notification.defaults |= Notification.DEFAULT_VIBRATE; ·使用自定义振动 long[] vibrate = {0,100,200,300};notification.vibrate = vibrate; ·注:如果定义了默认振动,那么自定义振动将被覆盖 灯光闪烁提醒 ·使用默认闪烁 notification.defaults |= Notification.DEFAULT_LIGHTS; ·使用自定义闪烁 notification.ledARGB = 0xff00ff00;// LED灯的颜色,绿灯notification.ledOnMS = 300;// LED灯显示的毫秒数,300毫秒notification.ledOffMS = 1000;// LED灯关闭的毫秒数,1000毫秒notification.flags |= Notification.FLAG_SHOW_LIGHTS; // 必须加上这个标志 更多特性 可以通过 Notification 的相关字段或标志(flags)为提醒设置更多的特性。 ·FLAG_AUTO_CANCEL标志:当提醒被用户点击之后会自动被取消(cancel); ·FLAG_INSISTENT标志:在用户响应之前会一直重复提醒音; ·FLAG_ONGOING_EVENT标志:Add this to theflagsfield to group the notification under the "Ongoing" title in the Notifications window. ·FLAG_NO_CLEAR标志:当在提醒栏中点击“清除提醒”按钮时,该提醒将不会被清除; ·number字段:This value indicates the current number of events represented by the notification. The appropriate number is overlaid on top of the status bar icon. If you intend to use this field, then you must start with "1" when the Notification is first created. (If you change the value from zero to anything greater during an update, the number is not shown.) ·iconLevel字段:This value indicates the current level of aLevelListDrawablethat isused for the notification icon. You can animate the icon in the status bar by changingthis value to correlate with the drawable's defined in a LevelListDrawable. ·contentView字段:To define your own layout for the expanded message, instantiate a RemoteViews object and pass it to thecontentViewfield of your Notification. Pass the PendingIntent to thecontentIntentfield. 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/657502

优秀的个人博客,低调大师

Android开发学习笔记:TextView的属性详解

android:autoLink :设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web /email/phone/map/all) android:autoText :如果设置,将自动执行输入值的拼写纠正。此处无效果,在显示输入法并输入的时候起作用。 android:bufferType : 指定getText()方式取得的文本类别。选项editable 类似于StringBuilder :可追加字符,也就是说getText后可调用append方法设置文本内容。spannable :则可在给定的字符区域使用样式,参见这里1、这里2。 android:capitalize :设置英文字母大写类型。此处无效果,需要弹出输入法才能看得到,参见EditView此属性说明。 android:cursorVisible:设定光标为显示/隐藏,默认显示。 android:digits:设置允许输入哪些字符。如“1234567890.+-*/% ()” android:drawableBottom:在text的下方输出一个drawable,如图片。如果指定一个颜色的话会把text的背景设为该颜色,并且同时和background使用时覆盖后者。 android:drawableLeft:在text的左边输出一个drawable,如图片。 android:drawablePadding:设置text与drawable(图片)的间隔,与drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。 android:drawableRight:在text的右边输出一个drawable。 android:drawableTop:在text的正上方输出一个drawable。 android:editable:设置是否可编辑。 android:editorExtras:设置文本的额外的输入数据。 android:ellipsize:设置当文字过长时,该控件该如何显示。有如下值设置:”start”—?省略号显示在开头;”end” ——省略号显示在结尾;”middle”—-省略号显示在中间;”marquee” ——以跑马灯的方式显示(动画横向移动) android:freezesText:设置保存文本的内容以及光标的位置。 android:gravity:设置文本位置,如设置成“center”,文本将居中显示。 android:hintText:为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。此属性在 EditView中使用,但是这里也可以用。 android:imeOptions:附加功能,设置右下角IME动作与编辑框相关的动作,如actionDone右下角将显示一个“完成”,而不设置默认是一个回车符号。这个在EditView中再详细说明,此处无用。 android:imeActionId:设置IME动作ID。 android:imeActionLabel:设置IME动作标签。 android:includeFontPadding:设置文本是否包含顶部和底部额外空白,默认为true。 android:inputMethod:为文本指定输入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是这里报错找不到。 android:inputType:设置文本的类型,用于帮助输入法显示合适的键盘类型。在EditView中再详细说明,这里无效果。 android:linksClickable:设置链接是否点击连接,即使设置了autoLink。 android:marqueeRepeatLimit:在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为 marquee_forever时表示无限次。 android:ems:设置TextView的宽度为N个字符的宽度。这里测试为一个汉字字符宽度 android:maxEms:设置TextView的宽度为最长为N个字符的宽度。与ems同时使用时覆盖ems选项。 android:minEms:设置TextView的宽度为最短为N个字符的宽度。与ems同时使用时覆盖ems选项。 android:maxLength:限制显示的文本长度,超出部分不显示。 android:lines:设置文本的行数,设置两行就显示两行,即使第二行没有数据。 android:maxLines:设置文本的最大显示行数,与width或者layout_width结合使用,超出部分自动换行,超出行数将不显示。 android:minLines:设置文本的最小行数,与lines类似。 android:lineSpacingExtra:设置行间距。 android:lineSpacingMultiplier:设置行间距的倍数。如”1.2” android:numeric:如果被设置,该TextView有一个数字输入法。此处无用,设置后唯一效果是TextView有点击效果,此属性在EdtiView将详细说明。 android:password:以小点”.”显示文本 android:phoneNumber:设置为电话号码的输入方式。 android:privateImeOptions:设置输入法选项,此处无用,在EditText将进一步讨论。 android:scrollHorizontally:设置文本超出TextView的宽度的情况下,是否出现横拉条。 android:selectAllOnFocus:如果文本是可选择的,让他获取焦点而不是将光标移动为文本的开始位置或者末尾位置。 TextView中设置后无效果。 android:shadowColor:指定文本阴影的颜色,需要与shadowRadius一起使用。 android:shadowDx:设置阴影横向坐标开始位置。 android:shadowDy:设置阴影纵向坐标开始位置。 android:shadowRadius:设置阴影的半径。设置为0.1就变成字体的颜色了,一般设置为3.0的效果比较好。 android:singleLine:设置单行显示。如果和layout_width一起使用,当文本不能全部显示时,后面用“…”来表示。如android:text="test_ singleLine " android:singleLine="true" android:layout_width="20dp"将只显示“t…”。如果不设置singleLine或者设置为false,文本将自动换行 android:text:设置显示文本. android:textAppearance:设置文字外观。如 “?android:attr/textAppearanceLargeInverse”这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。可设置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse android:textColor:设置文本颜色 android:textColorHighlight:被选中文字的底色,默认为蓝色 android:textColorHint:设置提示信息文字的颜色,默认为灰色。与hint一起使用。 android:textColorLink:文字链接的颜色. android:textScaleX:设置文字之间间隔,默认为1.0f。 android:textSize:设置文字大小,推荐度量单位”sp”,如”15sp” android:textStyle:设置字形[bold(粗体) 0, italic(斜体) 1, bolditalic(又粗又斜) 2] 可以设置一个或多个,用“|”隔开 android:typeface:设置文本字体,必须是以下常量值之一:normal 0, sans 1, serif 2, monospace(等宽字体) 3] android:height:设置文本区域的高度,支持度量单位:px(像素)/dp/sp/in/mm(毫米) android:maxHeight:设置文本区域的最大高度 android:minHeight:设置文本区域的最小高度 android:width:设置文本区域的宽度,支持度量单位:px(像素)/dp/sp/in/mm(毫米),与layout_width 的区别看这里。 android:maxWidth:设置文本区域的最大宽度 android:minWidth:设置文本区域的最小宽度 附件:Android中的长度单位详解 Android中的长度单位详解(dp、sp、px、in、pt、mm)有很多人不太理解dp、sp 和px 的区别:现在这里介绍一下dp 和sp。dp 也就是dip。这个和sp 基本类似。如果设置表示长度、高度等属性时可以使用dp 或sp。但如果设置字体,需要使用sp。dp 是与密度无关,sp 除了与密度无关外,还与scale 无关。如果屏幕密度为160,这时dp 和sp 和px 是一样的。1dp=1sp=1px,但如果使用px 作单位,如果屏幕大小不变(假设还是3.2 寸),而屏幕密度变成了320。那么原来TextView 的宽度设成160px,在密度为320 的3.2 寸屏幕里看要比在密度为160 的3.2 寸屏幕上看短了一半。但如果设置成160dp 或160sp 的话。系统会自动将width 属性值设置成320px 的。也就是160 * 320 / 160。其中320 / 160 可称为密度比例因子。也就是说,如果使用dp 和sp,系统会根据屏幕密度的变化自动进行转换。 其他单位的含义 px:表示屏幕实际的象素。例如,320*480 的屏幕在横向有320个象素,在纵向有480 个象素。 in:表示英寸,是屏幕的物理尺寸。每英寸等于2.54 厘米。例如,形容手机屏幕大小,经常说,3.2(英)寸、3.5(英)寸、4(英)寸就是指这个单位。这些尺寸是屏幕的对角线长度。如果手机的屏幕是3.2 英寸,表示手机的屏幕(可视区域)对角线长度是3.2*2.54 = 8.128 厘米。读者可以去量一量自己的手机屏幕,看和实际的尺寸是否一致。 mm:表示毫米,是屏幕的物理尺寸。 pt:表示一个点,是屏幕的物理尺寸。大小为1 英寸的1/72。 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/627123

优秀的个人博客,低调大师

Android开发学习笔记:手机震动控制浅析

Android系统中Vibrator对象负责对手机震动的处理,具体的实现方法: 1.获取振动器Vibrator的实例: Vibratorvibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE); getSystemService(VIBRATOR_SERVICE):获得一个震动的服务 2.调用vibrate方法来产生震动: 只向vibrate()传递一个参数,这个参数用来指定振动的毫秒数 //震动5秒 vibrator.vibrate(5000); 向vibrate()方法传递多个参数 //等待1秒,震动2秒,等待1秒,震动3秒 long[]pattern={1000,2000,1000,3000}; //-1表示不重复,如果不是-1,比如改成1,表示从前面这个long数组的下标为1的元素开始重复. vibrator.vibrate(pattern,-1); 3.取消震动 vibrator.cancel(); 4.在AndroidManifest.xml文件添加权限 <uses-permissionandroid:name="android.permission.VIBRATE"/> 下面的实例包含了产生震动的两个方法 VibratorDemoActivity.java packagecom.lingdududu.test; importandroid.app.Activity; importandroid.os.Bundle; importandroid.os.Vibrator; importandroid.view.MotionEvent; /* *@authorlingdududu *当程序开始运行结束时,手机等待1秒就开始震动2秒,再等待1秒,开始震动3秒 *当我们点击手机屏幕,触发onTouchEvent事件,手机就开始震动1秒 */ publicclassVibratorDemoActivityextendsActivity{ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Vibratorvibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE); long[]pattern={1000,2000,1000,3000};//OFF/ON/OFF/ON...... vibrator.vibrate(pattern,-1); } @Override publicbooleanonTouchEvent(MotionEventevent){ if(event.getAction()==MotionEvent.ACTION_MOVE){ Vibratorvibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE); vibrator.vibrate(1000); } returnsuper.onTouchEvent(event); } } 注:记得在AndroidManifest.xml文件添加权限,还有程序要在真机上运行才能有震动的效果,模拟器上不支持震动的。 PS:我正在参加IT博客大赛,欢迎大家来投我一票的 http://blog.51cto.com/contest2011/3061169 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/724042

优秀的个人博客,低调大师

Android学习笔记(三)基础知识(2)

交互对话框 使用Android SDK中,具有交互功能的对话框是AlertDialog窗口。 package com.example.test8; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { private Button bt; int n=0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt=(Button)findViewById(R.id.button1); bt.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub n++; String str=Integer.toString(n); bt.setText("点击次数:"+n); new AlertDialog.Builder(MainActivity.this) .setTitle("提示") .setMessage("对话框") .setPositiveButton("确定",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } } ) .show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } } 拖放相片特效 在Android中,拖动图片的特效可以通过Android.content.Context,Android,widget.BaseAdapter和Android.widget.imageView等来实现。 在下面的列子中,context可以像画布一样,随时可以被处理覆盖。Context是作为Android.content子类。通过widget.BaseAdapter作为容器来存放Gallery所需要的图片。 这里是通过使用Gallery实现的相片拖拽功能,具体代码如下: package com.example.test9; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.graphics.Color; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView; import android.widget.TextView; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { private TextView textview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textview = (TextView)findViewById(R.id.textView1); textview.setText("特效演示"); textview.setTextColor(Color.BLUE); Gallery gallery=(Gallery)findViewById(R.id.gallery1); gallery.setAdapter(new ImageAdapter(this)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public class ImageAdapter extends BaseAdapter{ private Context myContext; private int[] myImageID={android.R.drawable.btn_minus, android.R.drawable.btn_radio, android.R.drawable.ic_lock_idle_low_battery, android.R.drawable.ic_menu_camera }; public ImageAdapter(Context c){ this.myContext=c; } public int getCount() { // TODO Auto-generated method stub return this.myImageID.length; } public Object getItem(int position) { // TODO Auto-generated method stub return position; } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ImageView i=new ImageView(this.myContext); i.setImageResource(this.myImageID[position]); i.setScaleType(ImageView.ScaleType.FIT_XY); i.setLayoutParams(new Gallery.LayoutParams(120,120)); return i; } } } 设置about关于信息 创建一个onCreateOptionsMenu(Menu menu)类函数,用于添加Menu菜单项,再利用onOptionItemSelected选择菜单项 package com.example.test10; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.view.Menu; import android.view.MenuItem; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add(0,0,0,"关于"); menu.add(0,1,1,"退出"); return super.onCreateOptionsMenu(menu); } public boolean onOptionsItemSelected(MenuItem item){ super.onOptionsItemSelected(item); switch(item.getItemId()){ case 0: openOptionsDialog(); break; case 1: finish(); } return true; } private void openOptionsDialog(){ new AlertDialog.Builder(this) .setTitle("关于") .setMessage("***") .setPositiveButton("OK",new OnClickListener() { public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }) .show(); } } 程序加载中状态框 程序加载中的提示,此功能是通过Progress Dialog类来运行,此类在Android.app.ProgressDialog类里。但是,我们需要注意使用dismiss()函数来关闭取得焦点的对话框,否则程序将陷入死循环,也不能在线程里更改CONTEXT或parent view的任何状态。 package com.example.test11; import android.os.Bundle; import android.app.Activity; import android.app.ProgressDialog; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { private TextView text; private Button bt; public ProgressDialog myDialog=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text=(TextView)findViewById(R.id.textView1); bt=(Button)findViewById(R.id.button1); bt.setOnClickListener(myShowProgressBar); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } Button.OnClickListener myShowProgressBar=new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub final CharSequence strDialogTile="请等待"; final CharSequence strDialogBody="程序正在运行"; myDialog=ProgressDialog.show(MainActivity.this,strDialogTile,strDialogBody,true); text.setText(strDialogBody); new Thread(){ public void run(){ try{ text.setText("start"); sleep(3000); text.setText("end"); }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } finally{ myDialog.dismiss(); } } }.start(); } }; } 本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/archive/2013/05/16/3076677.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Storm概念学习系列之storm简介

storm简介 Storm 是 Twitter 开源的、分布式的、容错的实时计算系统,遵循 Eclipse Public License1.0。 Storm 通过简单的 API 使开发者可以可靠地处理无界持续的流数据,进行实时计算。 Twitter Storm 是使用 Clojure(发音同 closure)语言实现的。 Clojure 是 Lisp 语言的一种现代方言。类似于 Lisp, Clojure 支持一种功能性编程风格,但 Clojure 还引入了一些特性来简化多线程编程(一种对创建 Storm 很有用的特性)。 Clojure 是一种基于虚拟机(VM)的语言,在 Java 虚拟机上运行。尽管 Storm 是使用 Clojure 语言开发的,但是仍然可以在 Storm 中使用几乎任何语言编写应用程序,所需的只是一个连接到 Storm 架构的适配器。已存在针对Scala、 JRuby、 Perl 和 PHP 的适配器,但是还有支持流式传输到 Storm 拓扑结构中的结构化查询语言适配器——可以通过标准输入、标准输出以 JSON 格式协议与 Storm 通信。 Storm 可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm 之于实时处理,就好比 Hadoop 之于批处理。Storm 保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。 Storm 的处理速度非常惊人:经测试,每个节点每秒可以处理 100 万个数据元组 Clojure的维基百科:https://zh.wikipedia.org/wiki/Clojure Clojure的百度百科:http://baike.baidu.com/link?url=2ODx328uV6zJESQOVT3DFObTCkj6JJPzH-Iv0uJ_uYtZ3nRDGHU0jg6u-ItutvFRhduMFU2LHt9WM0AnP4oHua 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5989244.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Storm概念学习系列之Task任务

每一个Spout/Bolt的线程称为一个Task。 Task任务 Task是运行Spout或Bolt的单元,每一个Spout/Bolt的线程称为一个Task。在Storm 0.8及之后的版本中,Task不再与物理线程对应,同一个Spout/Bolt的Task可能会共享一个物理线程,该线程称为Executor。 实际的数据处理由Task完成,在Topology的生命周期中,每个组件的Task数量不会变化,而Executor的数量却不一定。在一般情况下,线程数小于等于Task数量。默认Task的数量等于Executor线程数量,即一个Executor线程只运行一个Task。Executor线程在执行期间会调用该Task的nextTuple或execute方法。 每个Spout或Bolt都是通过集群中的许多任务来执行的。每个任务相当于一个执行线程,可以通过TopologyBuilder的setSpout方法和setBolt方法为每个Spout或Bolt设置并行数,即任务数。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5989729.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

马哥运维学习作业(四)

1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 1 2 3 4 5 6 7 8 9 10 11 12 [root@c6-1~] #cp-r/etc/skel//home/tuser1#使用cp-r递归复制文件夹内容到/home/tuser1下 [root@c6-1~] #ls-ld/home/tuser1/#查看/home下已有tuser1文件夹并看到默认权限为755 drwxr-xr-x.2rootroot4096Aug2517:47 /home/tuser1/ [root@c6-1~] #chmod-R700/home/tuser1/#使用chmod-R参数把/home/tuser1及其内部文件的权限都改为700。不使用-R递归参数,则只能改tuser1的权限 [root@c6-1~] #ll-d/home/tuser1/&&ll-a/home/tuser1/#同时验证tuser1和其内部文件权限都已改为属组和其它用户没有任何访问权限 drwx------.2rootroot4096Aug2517:47 /home/tuser1/ #文件夹权限 total20 drwx------.2rootroot4096Aug2517:47. drwxr-xr-x.5rootroot4096Aug2517:47.. -rwx------.1rootroot18Aug2517:47.bash_logout #下面是其内部文件的权限 -rwx------.1rootroot176Aug2517:47.bash_profile -rwx------.1rootroot124Aug2517:47.bashrc 图示: 2、编辑/etc/group文件,添加组hadoop。 方法一:手动vim编辑 1 2 3 4 5 [root@c6-1~] #vim/etc/group#使用vim编辑器打开/etc/group后,在末尾插入如下内容 ..........以上显示略 hadoop:x:2016: [root@c6-1~] #tail-1/etc/group#查看/etc/group最后一行已插入hadoop:x:2016: hadoop:x:2016: 注:使用vim编辑器打开/etc/group文件,按G(跳到行尾)-按yy(复制该行)-按p(粘帖该行到下一行)-按i(进入编辑状态),最后把第1,3列内容改为hadoop:x:2016: 注:也可直接打开vim编辑器到末尾输入hadoop:x:2016:保存退出,上面的操作是个人习惯,替换字符可减少错误的概率。 图示: 方法二:非交互式插入 1 2 3 [root@c6-2~] #echo"hadoop:x:2018">>/etc/group#非交互式插入内容 [root@c6-2~] #tail-1/etc/group#查看/etc/group最后一行已插入 hadoop:x:2018 图示: 3、手动编辑/etc/passwd文件新增一行,添加用户hadoop,其基本组ID为hadoop组的id号;其家目录为/home/hadoop。 1 2 3 4 5 [root@c6-1~] #vim/etc/passwd#按第2题的操作方法插入如下内容 ........以上显示略 hadoop:x:2016:2016:: /home/hadoop : /bin/bash [root@c6-1~] #idhadoop#idhadoop查看用户信息 uid=2016(hadoop)gid=2016(hadoop) groups =2016(hadoop) 图示: 4、复制/etc/skel目录为/home/hadoop,要求修改hadoop目录的属组和其它用户没有任何访问权限。 1 2 3 4 5 6 7 8 9 10 [root@c6-2~] #cp-r/etc/skel/home/hadoop#复制/etc/skel目录为/home/hadoop [root@c6-2~] #ll/home/#已复制完成,hadoop默认权限为755 total8 drwxr-xr-x.2rootroot4096Aug2421:06hadoop drwx------.4zdwzdw4096Jul2023:33zdw [root@c6-2~] #chmod700/home/hadoop/#按要求把hadoop目录改为属组和其它用户没有任何访问权限 [root@c6-2~] #ll/home/#再次查看,hadoop权限已设置好 total8 drwx------.2rootroot4096Aug2421:06hadoop drwx------.4zdwzdw4096Jul2023:33zdw 图示: 5、修改/home/hadoop目录及其内部所有文件的属主为hadoop,属组为hadoop。 1 2 3 4 5 [root@c6-2~] #chown-Rhadoop:hadoop/home/hadoop#使用chown-R命令把/home/hadoop目录及其内部所有文件属主、属组改为hadoop [root@c6-2~] #ll/home/#属主、属组已从原来的root,改为hadoop total8 drwx------.2hadoophadoop4096Aug2421:06hadoop drwx------.4zdwzdw4096Jul2023:33zdw 图示: 6、显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式; 方法一: 1 2 3 4 5 6 7 8 [root@C7-1~] #grep^[sS]/proc/meminfo#^匹配以sS开头,[]设置范围 SwapCached:0kB SwapTotal:2097148kB SwapFree:2097148kB Shmem:8628kB Slab:55796kB SReclaimable:23544kB SUnreclaim:32252kB 方法二: 1 2 3 4 5 6 7 8 [root@C7-1~] #grep-i'^s'/proc/meminfo#使用-i参数忽略大小写 SwapCached:0kB SwapTotal:2097148kB SwapFree:2097148kB Shmem:8628kB Slab:55796kB SReclaimable:23544kB SUnreclaim:32252kB 图示: 7、显示/etc/passw d文件中其默认shell为非/sbin/nologin的用户; 1 [root@C7-1~] #grep-v"/sbin/nologin"/etc/passwd|cut-d:-f1 注:使用-v参数反向查找,cut -d: -f1指定分隔符为冒号,显示第一列用户名列 图示: 8、显示/etc/passw d文件中其默认shell为/bin/bash的用户; 方法一: 1 2 3 4 [root@C7-1~] #grep"/bin/bash$"/etc/passwd|cut-d:-f1 root zdw hadoop 注:$代表以/bin/bash结尾,适用于要搜索末尾的关键字后面有空格的,/bin/bash后面没有空格,直接使用下面的方法二即可。 方法二: 1 2 3 4 [root@C7-1~] #grep"/bin/bash"/etc/passwd|cut-d:-f1 root zdw hadoop 注:接上,cut -d: -f1指定分隔符为冒号,显示第一列用户名列,如果要看得更清楚,使用-f1,7把bash也显示出来 图示: 9、找出/etc/passwd文件中的一位数或两位数; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@C7-1~] #grep"\<[0-9]\{1,2\}\>"/etc/passwd root:x:0:0:root: /root : /bin/bash bin:x:1:1:bin: /bin : /sbin/nologin daemon:x:2:2:daemon: /sbin : /sbin/nologin adm:x:3:4:adm: /var/adm : /sbin/nologin lp:x:4:7:lp: /var/spool/lpd : /sbin/nologin sync :x:5:0: sync : /sbin : /bin/sync shutdown :x:6:0: shutdown : /sbin : /sbin/shutdown halt:x:7:0:halt: /sbin : /sbin/halt mail:x:8:12:mail: /var/spool/mail : /sbin/nologin operator:x:11:0:operator: /root : /sbin/nologin games:x:12:100:games: /usr/games : /sbin/nologin ftp :x:14:50:FTPUser: /var/ftp : /sbin/nologin nobody:x:99:99:Nobody:/: /sbin/nologin dbus:x:81:81:Systemmessagebus:/: /sbin/nologin tss:x:59:59:Accountusedbythetrouserspackagetosandboxthetcsddaemon: /dev/null : /sbin/nologin postfix:x:89:89:: /var/spool/postfix : /sbin/nologin sshd:x:74:74:Privilege-separatedSSH: /var/empty/sshd : /sbin/nologin 注:\<[0-9]\{1,2\}\>指的是第一位是数字,\{1,2\}前面的数字出现至少1次,最多2次,\<,\>是词首和词尾锚定,限定了数字只能是1位数或二位数,就不会出现3位或4位的数字。如果不加上锚定,就会把3位、4位数字也显示出来。注:[0-9]和[[:digit:]]代表的意思一样。 图示: 10、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; 方法一: 1 2 3 4 [root@c6-1~] #grep"^[[:space:]]\{1,\}"/boot/grub/grub.conf#\{1,\}是代表前面的字符至少出现一次 root(hd0,0) kernel /vmlinuz-2 .6.32-431.el6.x86_64roroot= /dev/mapper/VolGroup-lv_root rd_NO_LUKSLANG=en_US.UTF-8rd_NO_MDrd_LVM_LV=VolGroup /lv_swap SYSFONT=latarcyrheb-sun16crashkernel=autord_LVM_LV=VolGroup /lv_root KEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMrhgbquiet initrd /initramfs-2 .6.32-431.el6.x86_64.img 方法二: 1 2 3 4 [root@c6-1~] #grep-E"^[[:space:]]+"/boot/grub/grub.conf#\+也是代表前面的字符至少出现一次,所以二个显示出的结果都一样 root(hd0,0) kernel /vmlinuz-2 .6.32-431.el6.x86_64roroot= /dev/mapper/VolGroup-lv_root rd_NO_LUKSLANG=en_US.UTF-8rd_NO_MDrd_LVM_LV=VolGroup /lv_swap SYSFONT=latarcyrheb-sun16crashkernel=autord_LVM_LV=VolGroup /lv_root KEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMrhgbquiet initrd /initramfs-2 .6.32-431.el6.x86_64.img 图示: 11、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; 方法一: 1 2 3 4 5 6 7 [root@ cat ~] #grep"^#[[:space:]]\+[^[:space:]]\+"/etc/rc.d/rc.sysinit #/etc/rc.d/rc.sysinit-runonceatboottime #TakeninpartfromMiquelvanSmoorenburg'sbcheckrc. #CheckSELinuxstatus #Printatextbanner. #Onlyreadthisonce. ....以下显示略 注:[[:space:]]+表示至少一个空白字符,[^[:space:]]+表示至少一个非空白字符 方法二: 1 2 3 4 5 6 7 8 [root@ cat ~] #grep-E^#[[:space:]]\{1\}[^[:space:]]\{1\}/etc/rc.d/rc.sysinit #/etc/rc.d/rc.sysinit-runonceatboottime #TakeninpartfromMiquelvanSmoorenburg'sbcheckrc. #CheckSELinuxstatus #Printatextbanner. #Onlyreadthisonce. #Initializehardware ....以下显示略 注:使用-E支持扩展的正则表达式,[[:space:]]\{1\}表示至少一个空白字符,[^[:space:]]\{1\}表示至少一个非空白字符 图示: 12、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行; 方法一: 1 2 3 4 5 [root@C7-1~] #netstat-tan|grep'LISTEN[[:space:]]*$'#*$以空白字符任意次为结尾 tcp000.0.0.0:220.0.0.0:*LISTEN tcp00127.0.0.1:250.0.0.0:*LISTEN tcp600:::22:::*LISTEN tcp600::1:25:::*LISTEN 方法二: 1 2 3 4 5 [root@C7-1~] #netstat-tan|grep"\<LISTEN\>[[:space:]]*$"#\<LISTEN\>表示词首词尾锚定 tcp000.0.0.0:220.0.0.0:*LISTEN tcp00127.0.0.1:250.0.0.0:*LISTEN tcp600:::22:::*LISTEN tcp600::1:25:::*LISTEN 方法三: 1 2 3 4 5 [root@C7-1~] #netstat-tan|grep'LISTEN[[:space:]]\+$'#\+$以空白字符至少1次为结尾 tcp000.0.0.0:220.0.0.0:*LISTEN tcp00127.0.0.1:250.0.0.0:*LISTEN tcp600:::22:::*LISTEN tcp600::1:25:::*LISTEN 图示: 13、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息; 1 2 3 4 5 6 7 8 9 10 [root@c6-1~] #useraddbash#新建用户bash [root@c6-1~] #useraddtestbash#新建用户testbash [root@c6-1~] #useraddbasher#新建用户basher [root@c6-1~] #useradd-s/sbin/nologinnologin#新建用户nologin使用-s指定其shell为/sbin/nologin [root@c6-1~] #grep"^\([[:alnum:]]\+\>\).*\1$"/etc/passwd#注释在最后有详细说明 sync :x:5:0: sync : /sbin : /bin/sync shutdown :x:6:0: shutdown : /sbin : /sbin/shutdown halt:x:7:0:halt: /sbin : /sbin/halt bash :x:2017:2017:: /home/bash : /bin/bash nologin:x:2020:2020:: /home/nologin : /sbin/nologin 注:"^\([[:alnum:]]\+\>\).*\1$"的意思是做分组中间可出现任意内容,结尾匹配行首。 详细解答:\(和\)把里面的多个字符分成一组,当作一个整体进行处理,[[:alnum:]]\+代表以一个数字或字母开头后面可以跟任意位数的字符,\>表示这个字符的结束。.*表示中间可出现任意长度字符。\1$表示结尾匹配行首。 图示: 本文转自cix123 51CTO博客,原文链接:http://blog.51cto.com/zhaodongwei/1841892,如需转载请自行联系原作者

优秀的个人博客,低调大师

马哥运维学习作业(三)

1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 1 2 3 4 5 6 7 8 [root@c6-1~] #who rootpts /0 2016-08-2201:40(10.3.20.100) zdwpts /1 2016-08-2201:45(10.3.20.100) zdwpts /2 2016-08-2201:45(10.3.20.100) rootpts /3 2016-08-2201:46(10.3.20.100) [root@c6-1~] #who|cut-d''-f1|sort-u root zdw 2、取出最后登录到当前系统的用户的相关信息。 1 2 [root@c6-1~] #last|head-1 rootpts /3 10.3.20.100MonAug2201:46stilllogged in 3、取出当前系统上被用户当作其默认shell的最多的那个shell。 1 2 [root@c6-1~] #cat/etc/passwd|cut-d:-f7|sort|uniq-c|sort-n|tail-1 15 /sbin/nologin 4、将/etc/passwd 中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。 1 2 3 4 5 6 7 8 9 10 11 12 [root@c6-1~] #sort-t:-k3-n/etc/passwd|tail-10|tr"a-z""A-Z">/tmp/maxusers.txt [root@c6-1~] #cat/tmp/maxusers.txt OPERATOR:X:11:0:OPERATOR: /ROOT : /SBIN/NOLOGIN GAMES:X:12:100:GAMES: /USR/GAMES : /SBIN/NOLOGIN GOPHER:X:13:30:GOPHER: /VAR/GOPHER : /SBIN/NOLOGIN FTP:X:14:50:FTPUSER: /VAR/FTP : /SBIN/NOLOGIN VCSA:X:69:69:VIRTUALCONSOLEMEMORYOWNER: /DEV : /SBIN/NOLOGIN SSHD:X:74:74:PRIVILEGE-SEPARATEDSSH: /VAR/EMPTY/SSHD : /SBIN/NOLOGIN POSTFIX:X:89:89:: /VAR/SPOOL/POSTFIX : /SBIN/NOLOGIN NOBODY:X:99:99:NOBODY:/: /SBIN/NOLOGIN SASLAUTH:X:499:76: "SASLAUTHDUSER" : /VAR/EMPTY/SASLAUTH : /SBIN/NOLOGIN ZDW:X:500:500:: /HOME/ZDW : /BIN/BASH 5、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。 1 2 [root@c6-1~] #ifconfig|grepinet|cut-d:-f2|cut-d''-f1|head-1 10.3.20.80 6、列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@c6-1~] #ls/etc/*.conf|tr"a-z""A-Z">/tmp/etc.conf [root@c6-1~] #cat/tmp/etc.conf /ETC/DRACUT .CONF /ETC/GAI .CONF /ETC/GRUB .CONF /ETC/HOST .CONF /ETC/KRB5 .CONF /ETC/LD .SO.CONF /ETC/LIBAUDIT .CONF /ETC/LIBUSER .CONF /ETC/LOGROTATE .CONF /ETC/MKE2FS .CONF /ETC/NSSWITCH .CONF /ETC/RESOLV .CONF /ETC/RSYSLOG .CONF /ETC/SESTATUS .CONF /ETC/SUDO .CONF /ETC/SUDO-LDAP .CONF /ETC/SYSCTL .CONF /ETC/YUM .CONF 7、显示/var目录下一级子目录或文件的总个数。 1 2 [root@c6-1~] #ls/var/|wc-l 16 8、取出/etc/group文件中第三个字段数值最小的10个组的名字。 1 2 3 4 5 6 7 8 9 10 11 [root@c6-1~] #sort-t:-k3-n/etc/group|head-10|cut-d:-f1 root bin daemon sys adm tty disk lp mem kmem 9、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 [root@c6-1~] #cat/etc/{fstab,issue}>/tmp/etc.test [root@c6-1~] #cat/tmp/etc.test # #/etc/fstab #CreatedbyanacondaonMonFeb2901:31:342016 # #Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' #Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo # /dev/mapper/VolGroup-lv_root /ext4defaults11 UUID=e880d9c0-5a7e-4e59-a49b-06488a6e4208 /boot ext4defaults12 /dev/mapper/VolGroup-lv_swap swapswapdefaults00 tmpfs /dev/shm tmpfsdefaults00 devpts /dev/pts devptsgid=5,mode=62000 sysfs /sys sysfsdefaults00 proc /proc procdefaults00 CentOSrelease6.5(Final) Kernel\ronan\m 10、请总结描述用户和组管理类命令的使用方法并完成以下练习: (1)、创建组distro,其GID为2016; 1 2 3 [root@c6-1~] #groupadd-g2016distro [root@c6-1~] #tail-1/etc/group distro:x:2016: (2)、创建用户mandriva, 其ID号为1005;基本组为distro; 1 2 3 [root@c6-1~] #useradd-u1005-gdistromandriva [root@c6-1~] #idmandriva uid=1005(mandriva)gid=2016(distro) groups =2016(distro) (3)、创建用户mageia,其ID号为1100,家目录为/home/linux; 1 2 3 [root@c6-1~] #useradd-u1100-d/home/linuxmageia [root@c6-1~] #tail-1/etc/passwd mageia:x:1100:1100:: /home/linux : /bin/bash (4)、给用户mageia添加密码,密码为mageedu; 1 2 3 [root@c6-1~] #echo"password"|passwd--stdinmageia Changingpassword for usermageia. passwd :allauthenticationtokensupdatedsuccessfully. (5)、删除mandriva,但保留其家目录; 1 2 3 4 5 [root@c6-1~] #userdelmandriva [root@c6-1~] #ls/home/ linuxmandrivazdw [root@c6-1~] #idmandriva id :mandriva:Nosuchuser (6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin; 1 2 3 4 [root@c6-1~] #groupaddpeguin [root@c6-1~] #useradd-u2002-gdistro-Gpeguinslackware [root@c6-1~] #idslackware uid=2002(slackware)gid=2016(distro) groups =2016(distro),2017(peguin) (7)、修改slackware的默认shell为/bin/tcsh; 1 2 3 [root@c6-1~] #usermod-s/bin/tcshslackware [root@c6-1~] #grep'slackware'/etc/passwd slackware:x:2002:2016:: /home/slackware : /bin/tcsh (8)、为用户slackware新增附加组admins; 1 2 3 4 [root@c6-1~] #groupaddadmins [root@c6-1~] #usermod-a-Gadminsslackware [root@c6-1~] #idslackware uid=2002(slackware)gid=2016(distro) groups =2016(distro),2017(peguin),2018(admins) (9)、为slackware添加密码,且要求密码最短使用期限为3天,最长为180天,警告为3天; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@c6-1~] #echo"123456"|passwd--stdinslackware Changingpassword for userslackware. passwd :allauthenticationtokensupdatedsuccessfully. [root@c6-1~] #passwd-n3-x180-w3slackware Adjustingagingdata for userslackware. passwd :Success [root@c6-1~] #chage-lslackware Lastpasswordchange:Aug21,2016 Passwordexpires:Feb17,2017 Passwordinactive:never Accountexpires:never Minimumnumberofdaysbetweenpasswordchange:3 Maximumnumberofdaysbetweenpasswordchange:180 Numberofdaysofwarningbeforepasswordexpires:3 (10)、添加用户openstack,其ID号为3003, 基本组为clouds,附加组为peguin和nova; 1 2 3 4 5 [root@c6-1~] #groupaddclouds [root@c6-1~] #groupaddnova [root@c6-1~] #useradd-u3003-gclouds-Gpeguin,novaopenstack [root@c6-1~] #idopenstack uid=3003(openstack)gid=2019(clouds) groups =2019(clouds),2017(peguin),2020(nova) (11)、添加系统用户mysql,要求其shell为/sbin/nologin; 1 2 3 [root@c6-1~] #useradd-s/sbin/nologinmysql [root@c6-1~] #grep'mysql'/etc/passwd mysql:x:3004:3004:: /home/mysql : /sbin/nologin (12)、使用echo命令,非交互式为openstack添加密码。 1 2 3 [root@c6-1~] #echo"password"|passwd--stdinopenstack Changingpassword for useropenstack. passwd :allauthenticationtokensupdatedsuccessfully. 本文转自cix123 51CTO博客,原文链接:http://blog.51cto.com/zhaodongwei/1840876,如需转载请自行联系原作者

优秀的个人博客,低调大师

PHP开源项目《phpbeginner_gmanage》学习日记

项目链接:https://github.com/udoless/phpbeginner_gmanage 2016.10.10 common.inc.php |--global.func.php(公共函数:检查登录状态) |--mysql.func.php (数据库操作函数) 基类,数据库连接及初始化,网站设置的初始化(如表的分页信息,由表gm_system来控制) 页面布局架构 title_admin.inc.php (标题-共用,同时动态引入了各个可变页面的css样式,以及公共的js文件) header_admin.inc.php(头-共用) 具体页面(不同的页面不一样) footer_admin.inc.php(脚-共用) 本文转自屠夫章哥 51CTO博客,原文链接:http://blog.51cto.com/4259297/1860246,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android开发学习笔记:EditText的属性介绍

EditText继承TextView,所以EditText具有TextView的属性特点,下面主要介绍一些EditText的特有的输入法的属性特点 android:layout_gravity="center_vertical":设置控件显示的位置:默认top,这里居中显示,还有bottom android:hin :Text为空时显示的文字提示信息,可通过textColorHint设置提示信息的颜色。 android:singleLine :设置单行输入,一旦设置为 true ,则文字不会自动换行。 android:gray="top" :多行中指针在第一行第一位置 et.setSelection(et.length()); :调整光标到最后一行 android:autoText :自动拼写帮助。这里单独设置是没有效果的,可能需要其他输入法辅助才行 android:capitalize :设置英文字母大写类型。设置如下值:sentences仅第一个字母大写;words每一个单词首字母大小,用空格区分单词;characters每一个英文字母都大写。 android:digits :设置允许输入哪些字符。如“1234567890.+-*/%\n()” android:singleLine :是否单行或者多行,回车是离开文本框还是文本框增加新行 android:numeric :如果被设置,该TextView接收数字输入。有如下值设置:integer正整数、signed带符号整数、decimal带小数点浮点数。 android:inputType:设置文本的类型 android:password :密码,以小点”.”显示文本 android:phoneNumber :设置为电话号码的输入方式。 android:editable :设置是否可编辑。仍然可以获取光标,但是无法输入。 android:autoLink=”all” :设置文本超链接样式当点击网址时,跳向该网址 android:textColor = "#ff8c00" :字体颜色 android:textStyle="bold" :字体, bold, italic, bolditalic android:textAlign="center" : EditText 没有这个属性,但 TextView 有 android:textColorHighlight="#cccccc" :被选中文字的底色,默认为蓝色 android:textColorHint="#ffff00" :设置提示信息文字的颜色,默认为灰色 android:textScaleX="1.5" :控制字与字之间的间距 android:typeface="monospace" :字型, normal, sans, serif, monospace android:background="@null" :空间背景,这里没有,指透明 android:layout_weight="1" :权重在控制控件显示的大小时蛮有用的。 android:textAppearance="?android:attr/textAppearanceLargeInverse" :文字外观,这里引用的是系统自带的一个外观,?表示系统是否有这种外观,否则使用默认的外观。 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/627350

优秀的个人博客,低调大师

Android开发学习笔记:Service的远程调用

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信。为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Service中的一个方法,那么就可以通过这种方式来实现了。 AIDL是Android的一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象。 AIDL RPC机制是通过接口来实现的,类似Windows中的COM或者Corba,但他是轻量级的,客户端和被调用实现之间是通过代理模式实现的,代理类和被代理类实现同一个接口Ibinder接口。 下面是实现Activity访问Service例子的步骤: 一.创建.aidl文件 AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。重要的是必须导入导入除了内建类型(例如:int,boolean等)外的任何其他类型,哪怕是这些类型是在与接口相同的包中。具体的要求如下: JAVA基本数据类型不需要导入 String,List,Map和CharSequence不需要导入 使用Eclipse的ADT插件创建一个BookInfo.aidl文件,该文件有4个方法: setName(String name)设置图书的书名,setPrice(int price)设置图书的价格,setPublish(String pname)设置图书的出版社和String display()显示图书的信息. BookInfo.aidl文件 packagecom.android.aidl; //BookInfo接口 interfaceBookInfo{ voidsetName(Stringname); voidsetPrice(intprice); voidssetPublish(Stringpname); //显示图书的信息 Stringdisplay(); } 创建好BookInfo.aidl文件,系统会自动在gen目录下生成Java接口文件BookInfo.java 二.实现AIDL文件生成的JAVA接口 AIDL会生成一个和.aidl文件同名的JAVA接口文件,该接口中有一个静态抽象内部类Stub,该类中声明了AIDL文件中定义的所有方法,其中有一个重要的方法是asInterface(),该方法通过代理模式返回JAVA接口的实现我们可以定义一个实现类,BookImpl,该类继承Stub类,实现我们定义的4个方法 packagecom.android.aidl; importandroid.os.RemoteException; publicclassBookInfoImplextendsBookInfo.Stub{ //声明三个个变量 privateintprice; privateStringname,pname; //显示书名,价格,出版社 publicStringdisplay()throwsRemoteException{ return"书名:"+name+";价格:"+price+";出版社:"+price; } @Override //设置书名 publicvoidsetName(Stringname)throwsRemoteException{ //TODOAuto this.name=name; } @Override //设置价格 publicvoidsetPrice(intprice)throwsRemoteException{ //TODOAuto-generatedmethodstub this.price=price; } @Override //设置出版社 publicvoidsetPublish(Stringpname)throwsRemoteException{ //TODOAuto this.pname=pname; } } 三.向客户端暴露接口 现在已经实现了BookInfo接口,接下来要将该接口暴露给客户端调用。一般通过定义一个Service来实现,在Service的onBind()方法中返回该接口,当我们绑定该接口时调用该方法。 packagecom.android.aidl; importcom.android.aidl.BookInfo.Stub; importandroid.app.Service; importandroid.content.Intent; importandroid.os.IBinder; publicclassRemoteServiceextendsService{ //声明BookInfo接口 privateStubbookifo=newBookInfoImpl(); publicIBinderonBind(Intentintent){ returnbookifo; } } 四.在客户端调用 定义一个Activity来绑定远程Service,获得BookInfo接口,通过RPC机制调用接口中的方法。 packagecom.android.aidl; importandroid.app.Activity; importandroid.app.Service; importandroid.content.ComponentName; importandroid.content.Intent; importandroid.content.ServiceConnection; importandroid.os.Bundle; importandroid.os.IBinder; importandroid.os.RemoteException; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.Toast; publicclassMainActivityextendsActivity{ //声明IPerson接口 privateBookInfobookInfo; //声明Button privateButtonbtn; //实例化ServiceConnection privateServiceConnectionconn=newServiceConnection(){ @Override synchronizedpublicvoidonServiceConnected(ComponentNamename,IBinderservice){ //获得IPerson接口 bookInfo=BookInfo.Stub.asInterface(service); if(bookInfo!=null) try{ //RPC方法调用 bookInfo.setName("GoogleAndroidSDK开发范例大全"); bookInfo.setPrice(55); bookInfo.setPublish("人民邮电出版社"); Stringmsg=bookInfo.display(); //显示方法调用返回值 Toast.makeText(MainActivity.this,msg,Toast.LENGTH_LONG) .show(); }catch(RemoteExceptione){ e.printStackTrace(); } } @Override publicvoidonServiceDisconnected(ComponentNamename){ } }; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //设置当前视图布局 setContentView(R.layout.main); //实例化Button btn=(Button)findViewById(R.id.Button1); //为Button添加单击事件监听器 btn.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //实例化Intent Intentintent=newIntent(); //设置IntentAction属性 intent.setAction("com.android.aidl.action.MY_REMOTE_SERVICE"); //绑定服务 bindService(intent,conn,Service.BIND_AUTO_CREATE); } }); } } 五.main.xml和AndroidManifest.xml文件 main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:text="远程调用Service" android:id="@+id/Button1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 在AndroidManifest.xml文件16~20声明Service <?xmlversion="1.0"encoding="utf-8"?> <manifestxmlns:android="http://schemas.android.com/apk/res/android" package="com.android.aidl" android:versionCode="1" android:versionName="1.0"> <uses-sdkandroid:minSdkVersion="10"/> <applicationandroid:icon="@drawable/icon"android:label="@string/app_name"> <activityandroid:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <actionandroid:name="android.intent.action.MAIN"/> <categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <serviceandroid:name="RemoteService"> <intent-filter> <actionandroid:name="com.android.aidl.action.MY_REMOTE_SERVICE"/> </intent-filter> </service> </application> </manifest> 效果图: 本文转自 lingdududu 51CTO博客,原文链接:http://blog.51cto.com/liangruijun/653344

优秀的个人博客,低调大师

Android开发学习笔记:对话框浅析

对话框式程序运行中弹出的窗口。Android系统中有四种默认的对话框:警告对话框AlertDialog、进度对话框ProgressDialog、日期选择对话框DatePickerDialog以及时间选择对话框TimePickerDialog。除此之外,我们自定义自已的dialog。 一.警告对话框(AlertDialog) Android系统中最常用的对话框是AlertDialog,它是一个提示窗口,需要用户作出选择的。一般会有几个按钮、标题信息、提示信息等。 在程序中创建AlertDialog的步骤: 1.获得AlertDialog的静态内部类Builder对象,由该类来创建对话框,Builder所提供的方法如下: setTitle():给对话框设置title. setIcon():给对话框设置图标。 setMessage():设置对话框的提示信息 setItems():设置对话框要显示的一个list,一般用于要显示几个命令时 setSingleChoiceItems():设置对话框显示一个单选的List setMultiChoiceItems():用来设置对话框显示一系列的复选框。 setPositiveButton():给对话框添加”Yes”按钮。 setNegativeButton():给对话框添加”No”按钮。 2.调用Builder的create( )方法 3.调用AlertDialog的show( )方法显示对话框 下面是一个提示信息对话框的实例: AlertDialogActivity.java package com.android.dialog.activity; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class AlertDialogActivity extends Activity { private TextView tv; private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv = (TextView)findViewById(R.id.TextView_1); btn = (Button)findViewById(R.id.Button_1); //实例化AlertDialog.Builder对象 final AlertDialog.Builder builder = new AlertDialog.Builder(this); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { //设置提示信息,确定按钮 builder.setMessage("真的要删除该文件吗?").setPositiveButton("是", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { tv.setText("成功删除"); } //设置取消按钮 }).setNegativeButton("否", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { tv.setText("取消删除"); } }); //创建对话框 AlertDialog ad = builder.create(); //显示对话框 ad.show(); } } ); } } main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/TextView_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试AlertDialog" /> <Button android:id="@+id/Button_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="删除文件" /> </LinearLayout> 效果图: 二.进度对话框(ProgressDialog) 在程序中创建ProgressDialog的步骤: 1.覆盖Activity的onCreateDialog( )方法,并在其中创建对话框 2.调用Activity的showDialog( )方法,显示进度对话框 下面是一个提示进度对话框的实例: ProgressDialogActivity.java packagecom.android.progress.activity; importandroid.app.Activity; importandroid.app.Dialog; importandroid.app.ProgressDialog; importandroid.content.DialogInterface; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassProgressDialogActivityextendsActivity{ privateButtonbtn; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btn=(Button)findViewById(R.id.Button_1); btn.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ //调用Activity的showDialog()方法,显示进度对话框 showDialog(0); } }); } @Override protectedDialogonCreateDialog(intid){ //对进度对话框进行实例化 ProgressDialogdialog=newProgressDialog(this); //设置显示的标题 dialog.setTitle("测试ProgressDialog"); dialog.setIndeterminate(true); dialog.setMessage("程序正在Loading..."); dialog.setCancelable(true); dialog.setButton(Dialog.BUTTON_POSITIVE,"确定", newDialogInterface.OnClickListener(){ @Override publicvoidonClick(DialogInterfacedialog,intwhich){ dialog.cancel(); } } ); returndialog; } } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/Button_1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试ProgressDialog" /> </LinearLayout> 效果图: 三.日期,时间选择对话框(DatePickerDialog、TimePickerDialog) 在程序中创建日期,时间选择对话框的步骤: 1.覆盖Activity的onCreateDialog( )方法,并在其中创建对话框 2.分别在OnDateSetListener的onDateSet( )方法和OnTimeSetListener( )的onTimeSet( )事件方法中更改日期,时间 3.调用Activity的showDialog( )方法,显示进度对话框 MainActivity.java packagecom.android.datatime.activity; importjava.util.Calendar; importandroid.app.Activity; importandroid.app.DatePickerDialog; importandroid.app.Dialog; importandroid.app.TimePickerDialog; importandroid.app.DatePickerDialog.OnDateSetListener; importandroid.app.TimePickerDialog.OnTimeSetListener; importandroid.os.Bundle; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.DatePicker; importandroid.widget.TextView; importandroid.widget.TimePicker; publicclassMainActivityextendsActivity{ privateButtonbtn1,btn2; privateTextViewtv_1,tv_2; privateCalendarc;//获得日历实例 privateintm_year,m_month,m_day; privateintm_hour,m_minute; publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); btn1=(Button)findViewById(R.id.Button_1); btn2=(Button)findViewById(R.id.Button_2); c=Calendar.getInstance(); m_year=c.get(Calendar.YEAR); m_month=c.get(Calendar.MONTH); m_day=c.get(Calendar.DAY_OF_MONTH); m_hour=c.get(Calendar.HOUR); m_minute=c.get(Calendar.MINUTE); tv_1=(TextView)findViewById(R.id.TextView_1); tv_1.setText(m_year+":"+(m_month+1)+":"+m_day);//设置TextView里的内容为日期 tv_2=(TextView)findViewById(R.id.TextView_2); tv_2.setText(m_hour+":"+m_minute);//设置TextView里的内容为时间 btn1.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ showDialog(0);//显示日期对话框 } }); btn2.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){ showDialog(1);//显示时间对话框 } }); } //调用Activity的showDialog()方法显示进对话框 protectedDialogonCreateDialog(intid){ if(id==0) returnnewDatePickerDialog(this,l1,m_year,m_month,m_day); else returnnewTimePickerDialog(this,l2,m_hour,m_minute,false); } //设置日期监听器 privateOnDateSetListenerl1=newOnDateSetListener(){ publicvoidonDateSet(DatePickerview,intyear,intmonthOfYear, intdayOfMonth){ m_year=year; m_month=monthOfYear; m_day=dayOfMonth; tv_1.setText(m_year+":"+(m_month+1)+":"+m_day);//为TextView设置文本内容,重新显示日期 } }; //设置时间监听器 privateOnTimeSetListenerl2=newOnTimeSetListener(){ publicvoidonTimeSet(TimePickerview,inthourOfDay,intminute){ m_hour=hourOfDay; m_minute=minute; tv_2.setText(m_hour+":"+m_minute);//为TextView设置文本内容,重新显示时间 } }; } main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:text="" android:id="@+id/TextView_1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:text="" android:id="@+id/TextView_2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="修改日期" android:id="@+id/Button_1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="修改时间" android:id="@+id/Button_2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 效果图: 本文转自 lingdududu 51CTO博客,原文链接: http://blog.51cto.com/liangruijun/641365

优秀的个人博客,低调大师

[Android Pro] Java进阶学习:jar打包详解

jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布。 为什么会有这个玩意呢,首先,这是jar的全称:JavaTM Archive (JAR) file,是的,就是java存档文件。这有点类似zip文件,想一想它是干什么的用的呢,压缩!?没错就是要压缩,将我们原先零散的东西放到一下,重新 组织,所有这些目的只有一个:方便!好了,不用管他是怎么压缩的,我们的重点是哪些是我们要压缩的(输入),还有压缩成了什么(输出),进而将它发布(部 署)。 那我们的输入(要压缩的东西)主要是class文件,还有辅助的资源(这其中可能有图片,jsp文件,html文件等等)。 Jar技术在jdk1.1版本中就已存在,在1.2中又有了增强。接下来说说jar的好处吧,这是官方的描述:安全,快速下载,压缩,猎取包,版本化包, 可携。 说了这么多,我们现在开始实施。 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1.1或以上版本),看到什么: 用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ... 选项: -c 创建新的存档 -t 列出存档内容的列表 -x 展开存档中的命名的(或所有的〕文件 -u 更新已存在的存档 -v 生成详细输出到标准输出上 -f 指定存档文件名 -m 包含来自标明文件的标明信息 -0 只存储方式;未用zip压缩格式 -M 不产生所有项的清单(manifest〕文件 -i 为指定的jar文件产生索引信息 -C 改变到指定的目录,并且包含下列文件: 如果一个文件名是一个目录,它将被递归处理。 清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。 示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中: jar cvf classes.jar Foo.class Bar.class 示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有文件存档到一个名为 'classes.jar' 的存档文件中: jar cvfm classes.jar mymanifest -C foo/A.txt -C foo/B.txt jar cvf ${baseDir}/plugin.jar -C ${baseDir} com -C ${baseDir} assets jar基本操作: 1. 创建jar文件 jar cf jar-file input-file(s) c---want to Create a JAR file. f---want the output to go to a file rather than to stdout. eg: 1)jar cf myjar.jar query_maintain_insert.htm 2)jar cvf myjar.jar query_maintain_insert.htm v---Produces verbose(详细的) output. 3)jar cvf myjar.jar query_maintain_insert.htm mydirectory 4)jar cv0f myjar.jar query_maintain_insert.htm mydirectory 0---don't want the JAR file to be compressed. 5)jar cmf MANIFEST.MF myjar.jar yahh.txt m---Used to include manifest information from an existing manifest file. 6)jar cMf MANIFEST.MF myjar.jar yahh.txt M---the default manifest file should not be produced. 7)jar cvf myjar.jar * *---create all contents in current directory. 2. 察看jar文件 jar tf jar-file t---want to view the Table of contents of the JAR file. eg: 1)jar vft yahh.jar v---Produces verbose(详细的) output. 3. 提取jar文件 jar xf jar-file [archived-file(s)] x---want to extract files from the JAR archive. eg: 1)jar xf yahh.jar yahh.txt(仅提取文件yahh.txt) 2)jar xf yahh.jar alex/yahhalex.txt(仅提取目录alex下的文件yahhalex.txt) 3)jar xf yahh.jar(提取该jar包中的所有文件或目录) 4. 修改Manifest文件 jar cmf manifest-addition jar-file input-file(s) m---Used to include manifest information from an existing manifest file. 5. 更新jar文件 jar uf jar-file input-file(s) u---want to update an existing JAR file. 分类: Android Pro, Java基础 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/5648438.html如需转载请自行联系原作者 demoblog

优秀的个人博客,低调大师

Android学习笔记(二)基础知识(1)

更改文字颜色 文字色: TextView.setTextColor(Color.***); 背景色: Resources resources = getBaseContext().getResources(); Drawable HippoDrawable = resources.getDrawable(R.drawable.white); TextView.setBackgroundDrawable(HippoDrawable); 获取手机分辨率 import android.util.DisplayMetrics DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); String x,y; x=dm.widthPixels; y=dm.heightPixels; 页面转换 在Android应用中,是通过setContentView来实现页面的转换处理的,也就是在不同的layout之间进行切换。 setContentView(R.layout.****); 例子: package com.example.test4; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button b1=(Button)findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub jumpToMylayout(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void jumpToMylayout(){ setContentView(R.layout.mylayout); Button b2 = (Button)findViewById(R.id.button1); b2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub jumpToLayout(); } }); } public void jumpToLayout(){ setContentView(R.layout.activity_main); Button b1=(Button)findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub jumpToMylayout(); } }); } } 调用其他Activity 与上面在不同layout之间转换不同,这里我们需要移交主权到另外一个Activity。 //一个Activity Intent intent=new Intent(); intent.setClass(MainActivity.this,replace.class); startActivity(intent); MainActivity.this.finish(); //另外一个Activity Intent intent=new Intent(); intent.setClass(replace.this, MainActivity.class); startActivity(intent); replace.this.finish(); 不同Activity之间的数据转换 利用Android.os.Bundle对象封装数据的能力,将欲传递的数据或参数,通过Bundle来传递不同Intent之间的数据。 发送: Intent intent=new Intent(); intent.setClass(MainActivity.this,display.class); Bundle bundle = new Bundle(); bundle.putString("num",et1.getText().toString()); bundle.putString("name",et2.getText().toString()); intent.putExtras(bundle); startActivity(intent); 接收: Bundle bundle = this.getIntent().getExtras(); String num = bundle.getString("num"); String name = bundle.getString("name"); 返回数据到前一个Activity 唤起一个Activity: startActivityForResult(intent,0) 重载onActivityResult: protected voidonActivityResult(int requestCode,int resultCode,Intent data){ switch(resultCode){ case RESULT_OK: Bundle bundle=data.getExtras(); //code there break; default: break; } } 返回数据: input.this.setResult(RESULT_OK, intent); 部分代码: //main_activity package com.example.test7; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { TextView tx; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button bt=(Button)findViewById(R.id.button1); tx=(TextView)findViewById(R.id.textView1); bt.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(MainActivity.this, input.class); startActivityForResult(intent,0); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override protected void onActivityResult(int requestCode,int resultCode,Intent data){ switch(resultCode){ case RESULT_OK: Bundle bundle=data.getExtras(); String str=bundle.getString("str").toString(); tx.setText(str); break; default: break; } } } /** * input.java */ package com.example.test7; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class input extends Activity { Intent intent; Bundle bundle; EditText et; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.input); Button bt=(Button)findViewById(R.id.button1); et=(EditText)findViewById(R.id.editText1); intent = this.getIntent(); bundle= new Bundle(); bt.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub bundle.putString("str", et.getText().toString()); intent.putExtras(bundle); input.this.setResult(RESULT_OK, intent); input.this.finish(); } }); } } 本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/archive/2013/05/13/3075259.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Docker学习系列 之etcd(一)etcd简介

Etcd按照官方介绍 Etcd is a distributed, consistentkey-valuestore forshared configurationandservice discovery etcd 是一个分布式一致性键值存储,用于共享配置和服务发现,专注于: 简单: 良好定义的,面向用户的API (gRPC) 安全: 带有可选客户端证书认证的自动 TLS 快速: 测试验证,每秒 10000 写入 可靠: 使用Raft适当分布 etcd是Go编写,并使用 Raft 一致性算法来管理高可用复制日志。 为什么需要 Etcd 所有的分布式系统,都面临的一个问题是多个节点之间的数据共享问题,这个和团队协作的道理是一样的,成员可以分头干活,但总是需要共享一些必须的信息,比如谁是 leader, 都有哪些成员,依赖任务之间的顺序协调等。所以分布式系统要么自己实现一个可靠的共享存储来同步信息(比如 Elasticsearch ),要么依赖一个可靠的共享存储服务,而 Etcd 就是这样一个服务。 Etcd 提供什么能力 Etcd 主要提供以下能力,已经熟悉 Etcd 的读者可以略过本段。 提供存储以及获取数据的接口,它通过协议保证 Etcd 集群中的多个节点数据的强一致性。用于存储元信息以及共享配置。 提供监听机制,客户端可以监听某个key或者某些key的变更。用于监听和推送变更。 提供key的过期以及续约机制,客户端通过定时刷新来实现续约。用于集群监控以及服务注册发现。 提供原子的CAS(Compare-and-Swap)和 CAD(Compare-and-Delete)支持(v2通过接口参数实现,v3通过批量事务实现)。用于分布式锁以及leader选举。 Etcd 如何实现一致性的 Etcd使用Raft协议来维护集群内各个节点状态的一致性。简单说,Etcd集群是一个分布式系统,由多个节点相互通信构成整体对外服务,每个节点都存储了完整的数据,并且通过Raft协议保证每个节点维护的数据是一致的。 如图所示,每个Etcd节点都维护了一个状态机,并且,任意时刻至多存在一个有效的主节点。主节点处理所有来自客户端写操作,通过Raft协议保证写操作对状态机的改动会可靠的同步到其他节点。 Etcd工作原理核心部分在于Raft协议。本节接下来将简要介绍Raft协议,具体细节请参考其[论文]。 Raft协议正如论文所述,确实方便理解。主要分为三个部分:选主,日志复制,安全性。 1) 选主 Raft协议是用于维护一组服务节点数据一致性的协议。这一组服务节点构成一个集群,并且有一个主节点来对外提供服务。当集群初始化,或者主节点挂掉后,面临一个选主问题。集群中每个节点,任意时刻处于Leader, Follower, Candidate这三个角色之一。选举特点如下: 当集群初始化时候,每个节点都是Follower角色; 集群中存在至多1个有效的主节点,通过心跳与其他节点同步数据; 当Follower在一定时间内没有收到来自主节点的心跳,会将自己角色改变为Candidate,并发起一次选主投票;当收到包括自己在内超过半数节点赞成后,选举成功;当收到票数不足半数选举失败,或者选举超时。若本轮未选出主节点,将进行下一轮选举(出现这种情况,是由于多个节点同时选举,所有节点均为获得过半选票)。 Candidate节点收到来自主节点的信息后,会立即终止选举过程,进入Follower角色。 为了避免陷入选主失败循环,每个节点未收到心跳发起选举的时间是一定范围内的随机值,这样能够避免2个节点同时发起选主。 2) 日志复制 所谓日志复制,是指主节点将每次操作形成日志条目,并持久化到本地磁盘,然后通过网络IO发送给其他节点。其他节点根据日志的逻辑时钟(TERM)和日志编号(INDEX)来判断是否将该日志记录持久化到本地。当主节点收到包括自己在内超过半数节点成功返回,那么认为该日志是可提交的(committed),并将日志输入到状态机,将结果返回给客户端。 这里需要注意的是,每次选主都会形成一个唯一的TERM编号,相当于逻辑时钟。每一条日志都有全局唯一的编号。 主节点通过网络IO向其他节点追加日志。若某节点收到日志追加的消息,首先判断该日志的TERM是否过期,以及该日志条目的INDEX是否比当前以及提交的日志的INDEX跟早。若已过期,或者比提交的日志更早,那么就拒绝追加,并返回该节点当前的已提交的日志的编号。否则,将日志追加,并返回成功。 当主节点收到其他节点关于日志追加的回复后,若发现有拒绝,则根据该节点返回的已提交日志编号,发生其编号下一条日志。 主节点像其他节点同步日志,还作了拥塞控制。具体地说,主节点发现日志复制的目标节点拒绝了某次日志追加消息,将进入日志探测阶段,一条一条发送日志,直到目标节点接受日志,然后进入快速复制阶段,可进行批量日志追加。 按照日志复制的逻辑,我们可以看到,集群中慢节点不影响整个集群的性能。另外一个特点是,数据只从主节点复制到Follower节点,这样大大简化了逻辑流程。 3) 安全性 截止此刻,选主以及日志复制并不能保证节点间数据一致。试想,当一个某个节点挂掉了,一段时间后再次重启,并当选为主节点。而在其挂掉这段时间内,集群若有超过半数节点存活,集群会正常工作,那么会有日志提交。这些提交的日志无法传递给挂掉的节点。当挂掉的节点再次当选主节点,它将缺失部分已提交的日志。在这样场景下,按Raft协议,它将自己日志复制给其他节点,会将集群已经提交的日志给覆盖掉。 这显然是不可接受的。 其他协议解决这个问题的办法是,新当选的主节点会询问其他节点,和自己数据对比,确定出集群已提交数据,然后将缺失的数据同步过来。这个方案有明显缺陷,增加了集群恢复服务的时间(集群在选举阶段不可服务),并且增加了协议的复杂度。 Raft解决的办法是,在选主逻辑中,对能够成为主的节点加以限制,确保选出的节点已定包含了集群已经提交的所有日志。如果新选出的主节点已经包含了集群所有提交的日志,那就不需要从和其他节点比对数据了。简化了流程,缩短了集群恢复服务的时间。 这里存在一个问题,加以这样限制之后,还能否选出主呢?答案是:只要仍然有超过半数节点存活,这样的主一定能够选出。因为已经提交的日志必然被集群中超过半数节点持久化,显然前一个主节点提交的最后一条日志也被集群中大部分节点持久化。当主节点挂掉后,集群中仍有大部分节点存活,那这存活的节点中一定存在一个节点包含了已经提交的日志了。 至此,关于Raft协议的简介就全部结束了。 Etcd的使用场景 和ZK类似,Etcd有很多使用场景,包括: 配置管理 服务注册于发现 选主 应用调度 分布式队列 分布式锁 Etcd,Zookeeper,Consul 比较 这三个产品是经常被人拿来做选型比较的。 Etcd 和 Zookeeper 提供的能力非常相似,都是通用的一致性元信息存储,都提供watch机制用于变更通知和分发,也都被分布式系统用来作为共享信息存储,在软件生态中所处的位置也几乎是一样的,可以互相替代的。二者除了实现细节,语言,一致性协议上的区别,最大的区别在周边生态圈。Zookeeper 是apache下的,用java写的,提供rpc接口,最早从hadoop项目中孵化出来,在分布式系统中得到广泛使用(hadoop, solr, kafka, mesos 等)。Etcd 是coreos公司旗下的开源产品,比较新,以其简单好用的rest接口以及活跃的社区俘获了一批用户,在新的一些集群中得到使用(比如kubernetes)。虽然v3为了性能也改成二进制rpc接口了,但其易用性上比 Zookeeper 还是好一些。 而 Consul 的目标则更为具体一些,Etcd 和 Zookeeper 提供的是分布式一致性存储能力,具体的业务场景需要用户自己实现,比如服务发现,比如配置变更。而Consul 则以服务发现和配置变更为主要目标,同时附带了kv存储。 本文转自 ponpon_ 51CTO博客,原文链接:http://blog.51cto.com/liuxp0827/1898320,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册