当前位置:  编程技术>移动开发
本页文章导读:
    ▪打开程序在activity下出现一个AlertDialog        打开程序在activity上出现一个AlertDialog 只要把  showDialog(0); 写在oncreat里,这样打开应用就会加载。 public class Test extends Activity {     /** Called when the activity is first created. */     @Override     publ.........
    ▪ 关于self.用法的一些小结        关于self.用法的一些总结 最近有人问我关于什么时候用self.赋值的问题, 我总结了一下, 发出来给大家参考. 有什么问题请大家斧正.    关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不.........
    ▪ StartForResult的根本用法       StartForResult的基本用法 前阵子代码中有Activity跳转回调传值的需求,用到了StartForResult。   代码 demo,三个Activity,A B C ,A是启动用,跳转到B,B带参数至C,C关闭后传值给B     Test Activity pack.........

[1]打开程序在activity下出现一个AlertDialog
    来源: 互联网  发布时间: 2014-02-18
打开程序在activity上出现一个AlertDialog

只要把  showDialog(0); 写在oncreat里,这样打开应用就会加载。

public class Test extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        showDialog(0);

        Button button1 = (Button) findViewById(R.id.button1);

        button1.setOnClickListener(new Button.OnClickListener() {

 

            public void onClick(View v) {

                // TODO Auto-generated method stub

                showDialog(0);

            }

        });

 

    }

 

    @Override

    protected Dialog onCreateDialog(int id) {

        switch (id) {

            case 0: {

                Dialog dialog = new AlertDialog.Builder(Test.this).setTitle("Question")

                        .setMessage("Are you sure that you want to quit?") // 设置内容

                        .setPositiveButton("Yes", // 设置确定按钮

                                new DialogInterface.OnClickListener() {

                                    public void onClick(DialogInterface dialog, int whichButton) {

                                        setResult(RESULT_OK);

                                        finish();

                                    }

                                }).setNegativeButton("No", new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog, int whichButton) {

                            }

                        }).create();// 创建

                return dialog;

            }

            default: {

                return null;

            }

        }

    }

 

 

 

 

 

 

}


    
[2] 关于self.用法的一些小结
    来源: 互联网  发布时间: 2014-02-18
关于self.用法的一些总结

最近有人问我关于什么时候用self.赋值的问题, 我总结了一下, 发出来给大家参考. 有什么问题请大家斧正.

    关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解答的, 那它为什么和存取方法有关? 怎么有关的? 并没有多少人回答出来. 同时关于内存管理的内容, 请大家看旺财勇士的Objective-C内存管理总结~CC专版 , 有些东西我就不多解释了.
    进入正题, 我们经常会在官方文档里看到这样的代码:
MyClass.h

[/lang]
@interface MyClass : NSObject {
    MyObject *myObject;
}
@property (nonatomic, retain) MyObject *myObject;
@end
 

MyClass.m
 
@synthesize myObject;
 
-(id)init{
    if(self = [super init]){
        MyObject * aMyObject = [[MyObject alloc] init];
        self.myObject = aMyObject;
        [aMyObject release];
    }
    return self;
}

有人就问, 为什么要这么复杂的赋值? 为什么要加self. ? 直接写成self.myObject = [[MyObject alloc] init];不是也没有错么? 不加self有时好像也是正常的?

现在我们来看看内存管理的内容:

先看间接赋值的:
    1.加self.:
 
        MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
        self.myObject = aMyObject; //myObject retainCount = 2;
        [aMyObject release];//myObject retainCount = 1;
 

    2. 不加self.:
 
       MyObject * aMyObject = [[MyObject alloc] init]; //aMyObject retainCount = 1;
        myObject = aMyObject; //myObject retainCount = 1;
        [aMyObject release];//对象己经被释放 
 

再看直接赋值的:
    3.加self.:
 
        self.myObject = [[MyObject alloc] init]; //myObject retainCount = 2;
 

    4. 不加self.:
 
        myObject = [[MyObject alloc] init]; //myObject retainCount = 1;
 

现在是不是有点晕, 我们先来把代码改一下, 官方的一种常见写法: 

MyClass.h
 
@interface MyClass : NSObject {
    MyObject * _myObject;
}
@property (nonatomic, retain) MyObject *myObject;
@end
 

MyClass.m
 
@synthesize myObject = _myObject;
 

OK, 你现在再试下, 如果你用self._myObject = aMyObject; 或者 myObject = aMyObject; 你会得到一个错误, 为什么呢, 这里就是和Obj-c的存取方法有关了. 说白了很简单 , 大家都知道, @property (nonatomic, retain) MyObject *myObject; 是为一个属性设置存取方法, 只是平时我们用的方法名和属性名是一样的,现在你把它写成不同的名字, 就会很清楚了. _myObject是属性本身, myObject是存取方法名.

现在我们知道self.是访问属性的存取方法了, 那存取方法又怎么工作的? self.myObject = [[MyObject alloc] init]; 为什么会有内存泄露?
关于nonatomic我不多解释了, 它不是我要讲的重点, 而且我也没完全搞清楚, 不误导大家. 我只说assign, retain ,copy. 
get方法是: 
 
-(MyObject*)myObject{
    return _myObject;
}
 

Set方法是: 
 
// assign 
-(void)setMyObject:(id)newValue{
    _myObject = newValue; 
}
// retain 
-(void)setMyObject:(id)newValue{
    if (_myObject != newValue) { 
        [_myObject release]; 
        _myObject = [newValue retain]; 
    }  
}
// copy 
-(void)setMyObject:(id)newValue{
    if (_myObject != newValue) { 
        [_myObject release]; 
        _myObject = [newValue copy]; 
    } 
}
 

其实这些方法里还有别的内容, 并不只是这些. 而且这些方法可以被重写. 比如你写一个
 
-(MyObject*)myObject{
 
    return _myObject;
}
 

放在你的类里, 你调用self.myObject时(不要把它放在等号左边, 那会调用get方法)就会调用这个方法.

这里多说一句, @property 是为你设置存取方法, 和你的属性无关, 你可以只写一句
 
@property (readonly) NSString *name;
 

在你的类里实现
 
-(NSString*)name{
    NSLog(@"name");
    return @"MyClass";
}
 


同样可以用self.name调用.

现在回头说说我们开始的那四个赋值, 当不用self.的时候,  那句话只是一般的赋值, 把一个指针赋给另一个指针, 不会对分配的内存有任何影响, 所以2中不要最后[aMyObject release];这句话和4是一回事. 这里就不多说了.我们看看1和3, 
当调用setMyObject:方法时, 对newValue 做了一次retain操作, 我们必须把原来的newValue释放掉, 不然就会内存泄露, 在1里, 我们有个aMyObject可以用来释放, 在3里, 我们无法释放它, 所以, 在3里, 我们会多出来一个retainCount. 内存泄露了.

说了这么多, 我只想让大家清楚, 什么是调用属性本身, 什么是调用存取方法. 怎么样才能避免内存泄露, 而且, 以上例子里是在自己类里的调用, 如果这个类被别的类调用时, 更要注意一些, 

顺便说一下, 如果你想在其它类访问对象属性, 而不是通过存取方法, 你可以用myClass -> myObject来访问, 这样是直接访问对象本身, 不过你先要把myObject设成@public. 但这个是官方不提倡的, 

代码比较简单, 我还是发出来, 高人们可以忽略了.[

 

转自: http://www.cocoachina.com/bbs/read.php?tid-12850-page-1.html


    
[3] StartForResult的根本用法
    来源: 互联网  发布时间: 2014-02-18
StartForResult的基本用法

前阵子代码中有Activity跳转回调传值的需求,用到了StartForResult。

 

代码 demo,三个Activity,A B C ,A是启动用,跳转到B,B带参数至C,C关闭后传值给B

 

 

Test Activity

package com.nico;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Test extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button btn1 = (Button) findViewById(R.id.btn1);
        btn1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(Test.this,Test01.class);
				startActivity(intent);
			}
		});
    }
}
 

Test 01 Activity

 

package com.nico;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Test01 extends Activity {
	TextView txt2;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test01);
        Button btn2 = (Button) findViewById(R.id.btn2);
        txt2 = (TextView) findViewById(R.id.txt2);
        btn2.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.setClass(Test01.this, Test02.class);
				intent.putExtra("name", "nicolas");
                                 //101 是请求码,方便在onActivityResult方法内处理不同请求码返回的intent 请求码须>=0
				startActivityForResult(intent, 101);
			}
		});
    }

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		Log.v("Test","------------------------->");
		String ss = data.getStringExtra("newname");
		txt2.setText(ss);
		
	}
    
}

 Test02 Activity

 

package com.nico;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Test02 extends Activity {
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test02);
		Intent intent = getIntent();
		String ss = intent.getStringExtra("myname");
		Button btn3 = (Button) findViewById(R.id.btn3);
		TextView txt3 = (TextView) findViewById(R.id.txt3);
		txt3.setText(ss);
		btn3.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				Intent in = new Intent();
				in.putExtra("newname", "dqcao+newname");
                                //-1为RESULT_OK, 1为RESULT_CANCEL..
                                // in 则是回调的Activity内OnActivityResult那个方法内处理
				setResult(-1, in);
				Log.v("Test","-------->"+Test02.this.getCallingActivity().getClassName());

				finish();

			}
		});
	}
}
 

有的时候在多图层的时候,并不好用,因为在接收的ACTIVITY内,其Activity的callingActivity为空,具体还未去理。

 

当然全局变量 Application也可以使用....


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3